java 计算中位数的实现方法

Java计算中位数的实现方法

中位数是一个集合中的中间值。把所有数值按照大小排序,把这个序列的数学中间值称为中位数。对于有偶数个数的序列,不存在中间值,此时中位数为中间两个数的平均数。

在Java编程中,计算中位数可以使用以下两种方法:

方法一:暴力计算法

该方法是最直观的计算中位数的方法,但是时间复杂度较高,对于大量数据处理效率并不高。步骤如下:

  1. 对集合进行排序;
  2. 判断集合的长度,如果是偶数,则中位数为中间两个数的平均值;如果是奇数,则中位数为中间的那个数。

参考代码如下:

import java.util.Arrays;

public class Median {

    public static double getMedian(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length;
        // 判断集合长度为奇偶数
        if (len % 2 == 0) {
            return (nums[len / 2] + nums[len / 2 - 1]) / 2.0;
        } else {
            return nums[len / 2];
        }
    }

    public static void main(String[] args) {
        int[] nums1 = {2, 3, 1, 6, 5, 4};
        int[] nums2 = {2, 3, 1, 6, 5};
        System.out.println(getMedian(nums1)); // 输出 3.5
        System.out.println(getMedian(nums2)); // 输出 3
    }
}

方法二:快速选择算法

快速选择算法(QuickSelect)是一种从无序列表找到第k小元素的选择算法。它类似于快速排序算法:首先在数据集合中任选一个枢轴值(pivot),然后将所有小于枢轴值的元素移动到枢轴值左侧,所有大于枢轴值的元素移动到右侧,接着判断枢轴值所在的位置,如果枢轴值所在的位置为k,则枢轴值为所求的第k小的元素,如果k小于枢轴值所在的位置,则第k小的元素在枢轴值左侧,否则在右侧,递归进行此过程直到达到目标。

参考代码如下:

public class Median2 {

    public static double quickSelect(int[] nums, int left, int right, int k) {
        if (left == right) {
            return nums[left];
        }
        int pivotIdx = partition(nums, left, right, left + (right - left) / 2);
        if (k == pivotIdx) {
            return nums[k];
        } else if (k < pivotIdx) {
            return quickSelect(nums, left, pivotIdx - 1, k);
        } else {
            return quickSelect(nums, pivotIdx + 1, right, k);
        }
    }

    public static int partition(int[] nums, int left, int right, int pivotIdx) {
        int pivotValue = nums[pivotIdx];
        // 将枢轴值移动到队尾
        swap(nums, pivotIdx, right);
        int storeIdx = left;
        for (int i = left; i <= right; i++) {
            if (nums[i] < pivotValue) {
                swap(nums, storeIdx, i);
                storeIdx++;
            }
        }
        // 将枢轴值移动到正确的位置
        swap(nums, storeIdx, right);
        return storeIdx;
    }

    public static void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public static double getMedian(int[] nums) {
        int len = nums.length;
        // 判断集合长度为奇偶数
        if (len % 2 == 0) {
            return (quickSelect(nums, 0, len - 1, len / 2 - 1) + quickSelect(nums, 0, len - 1, len / 2)) / 2.0;
        } else {
            return quickSelect(nums, 0, len - 1, len / 2);
        }
    }

    public static void main(String[] args) {
        int[] nums1 = {2, 3, 1, 6, 5, 4};
        int[] nums2 = {2, 3, 1, 6, 5};
        System.out.println(getMedian(nums1)); // 输出 3.5
        System.out.println(getMedian(nums2)); // 输出 3
    }
}

上述代码中,快速选择算法的时间复杂度是O(n),相比于暴力计算法能够更快速地计算中位数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 计算中位数的实现方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python实现四舍五入的两个方法总结

    Python实现四舍五入的两个方法总结 方法一:round函数 在Python中,可以通过内置的round()函数实现四舍五入功能,其使用如下: a = round(3.1415926, 2) print(a) # 3.14 在上述例子中,3.1415926代表需要四舍五入的数字,2表示需要保留的小数位数。 如果保留的小数位数不指定,则默认为0,即对整数进行…

    python 2023年6月3日
    00
  • Python+OpenCV实现基本的图像处理操作

    Python+OpenCV实现基本的图像处理操作攻略 简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux,Windows,Android和Mac OS操作系统上。它轻量级而且高效,非常适合对图像和视频进行处理。Python+OpenCV结合使用,可以实现许多基本的图像处理操作。 在这篇攻略中,我们将讲解Python+…

    python 2023年5月18日
    00
  • 使用python爬取B站千万级数据

    下面我来为您详细讲解“使用python爬取B站千万级数据”的完整攻略。 引言 B站是一家知名的弹幕视频网站,拥有海量的视频资源。如果您是一名数据分析师,想要进行B站数据分析,那么获取B站数据就成为了必备的一部分。本文就是为大家介绍如何使用Python爬虫获取B站数据。 工具准备 本文涉及到以下工具: Python 3.x pymongo (Python的Mo…

    python 2023年6月6日
    00
  • python实现将元祖转换成数组的方法

    下面是关于”python实现将元祖转换成数组的方法”的完整攻略。 方法一:使用内置函数list() Python的内置函数list()能将元组转换成列表,列表即为Python中的数组。使用方法如下: # 定义元组 tup = (1, 2, 3, 4, 5) # 使用list()函数转换为数组 arr = list(tup) # 输出转换后的数组 print(…

    python 2023年6月5日
    00
  • Visual Studio code 配置Python开发环境

    下面是详细的Visual Studio Code配置Python开发环境的完整攻略。 环境准备 首先,需要在本地电脑上安装Visual Studio Code(简称VS Code)和Python。 下载并安装VS Code 首先需要前往VS Code官网下载页面(https://code.visualstudio.com/download),选择适合自己操作…

    python 2023年6月6日
    00
  • python分析网页上所有超链接的方法

    要分析网页上的所有超链接,可以使用 Python 中的 requests 库获取 HTML 页面,再使用 BeautifulSoup 库解析 HTML 代码,从而获取所有的超链接信息。 下面是详细的Python代码,可以实现获取一个网站上的所有超链接: import requests from bs4 import BeautifulSoup url = ‘…

    python 2023年6月3日
    00
  • Python爬虫之爬取某文库文档数据

    Python爬虫之爬取某文库文档数据 本篇攻略将介绍如何使用Python编写爬虫程序,从某文库网站爬取文档数据,并保存到本地文件中。我们将借助requests、beautifulsoup4、os等Python库来实现这个过程。 爬取网页 首先,我们需要利用requests库来获取网页的源代码。具体代码如下所示: import requests url = &…

    python 2023年5月14日
    00
  • python元组打包和解包过程详解

    Python元组打包和解包过程详解 在Python中,元组是一种非常有用的数据结构,具有不可变性和可迭代性等多种特性,常用于表示一组有序的数据。元组还有一个很重要的特性——允许同时存储多个值,也就是在定义元组时,可以将多个值一次性赋值给元组,这个过程称为元组打包。同时,也可以将一个元组中的多个值一一赋值给变量,这个过程称为元组解包。这篇文章将详细介绍Pyth…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部