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中处理Session和Cookie的方法

    Python中处理Session和Cookie的方法 在本文中,我们将介绍如何在Python中处理Session和Cookie。我们将使用requests库来发送HTTP请求,并使用session对象来处理Session和Cookie。 步骤1:发送HTTP请求 在处理Session和Cookie之前,我们需要先发送HTTP请求。以下是示例代码的步骤: 创建…

    python 2023年5月15日
    00
  • 如何在Python中使用PyODBC库连接Microsoft SQL Server数据库?

    以下是如何在Python中使用PyODBC库连接Microsoft SQL Server数据库的完整使用攻略,包括安装PyODBC库、连接Microsoft SQL Server数据库、执行查询语句等步骤。同时,提供了两个示例以便更好理解如何在Python中使用PyODBC库连接Microsoft SQL Server数据库。 步骤1:安装PyODBC库 在…

    python 2023年5月12日
    00
  • Python自动重新加载模块详解(autoreload module)

    Python自动重新加载模块详解(autoreload module) 在Python环境下,使用import语句导入模块是很常见的操作,但如果在开发中频繁地修改了导入的模块,就需要不断地重新导入。这对于大型项目或者复杂的模块来说,可能会很耗时。幸运的是,Python提供了一个模块autoreload,可以帮助我们自动重新加载模块。 安装autoreload…

    python 2023年5月19日
    00
  • Python实现图书借阅管理系统

    Python实现图书借阅管理系统 1. 系统概述 本系统是基于Python语言实现的,用于管理图书借阅流程的软件。系统包括以下三个模块: 图书管理模块:用于管理图书信息,包括书名、作者、出版社等 读者管理模块:用于管理读者信息,包括姓名、性别、年龄等 借阅管理模块:用于管理借阅流程,包括借出图书、归还图书等 2. 实现过程 2.1 数据库设计 在开发系统前,…

    python 2023年5月30日
    00
  • Python中文件的读取和写入操作

    下面是关于Python中文件读取和写入操作的完整攻略。 文件读取操作 Python中文件读取操作需要使用open()函数来打开文件,并且可以通过不同模式的文件打开方式来读取文件的内容。 打开文件 打开文件可以通过open()函数来实现。代码示例如下: file = open(‘filename.txt’, ‘r’) 其中,’filename.txt’是文件路…

    python 2023年6月3日
    00
  • 使用 ANSI 转义码 (Windows) 在 python 3.8 中更改控制台打印颜色

    【问题标题】:Change console print color in python 3.8 with ANSI escape codes (Windows)使用 ANSI 转义码 (Windows) 在 python 3.8 中更改控制台打印颜色 【发布时间】:2023-04-07 02:28:01 【问题描述】: 我正在尝试使用 ANSI 转义码在 p…

    Python开发 2023年4月7日
    00
  • 详解python算法之冒泡排序

    下面是关于“详解Python算法之冒泡排序”的完整攻略。 1. 冒泡排序算法理论基础 冒泡排序是一种简单的排序算法,它的基本思想是通过不断交换相邻的元素,将较大的元素逐渐“冒泡”到数组的末尾,从而实现排序。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。 2. Python实现 下面是Python实现冒泡排序的完整代码。 def bubble_so…

    python 2023年5月13日
    00
  • python ETL工具 pyetl

    什么是PyETL PyETL是Python ETL(Extract, Transform, Load)工具包,它可以帮助用户从多种数据源中提取数据,对数据进行转换和清洗后,将它们保存到文件、数据库或其他数据存储介质中。 PyETL的安装方法 PyETL可以通过pip安装,执行以下命令即可: pip install pyetl PyETL的使用方法 PyETL…

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