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实现断点调试方法的完整攻略。 什么是断点调试 在编写程序时,我们常常需要查看程序的执行情况,以便找出代码的错误。调试是一个解决这个问题的方法。其中一种调试方法是断点调试。 断点调试是指程序在执行到设定的断点时会停止,我们可以在停止状态下进行各种调试操作,比如查看变量的值,单步执行程序,等等。 如何在Python中实现断点调试 在P…

    python 2023年6月5日
    00
  • pandas 给dataframe添加列名的两种方法

    以下是详细的实例教程,包含两种添加列名的方法和示例说明。 方法一:在生成 dataframe 时指定列名 生成 dataframe 时可以在构造器中指定列名,例如: import pandas as pd import numpy as np data = [ [1, ‘A’, 10], [2, ‘B’, 20], [3, ‘C’, 30], [4, ‘D’…

    python 2023年5月13日
    00
  • 利用Python破解摩斯密码

    下面是利用Python破解摩斯密码的完整攻略。 什么是摩斯密码 摩斯密码是一种可以将人类可以识别的字符转换成电信号的编码方式,通常用于维吉尼亚电报机的电信传输。它由光、声、电等信号组成,常用于间谍、军事通讯、自卫等领域。摩斯密码由一个点(.),一个横线(-)和一个字符间的间隔组成。 如下是字母A至Z的摩斯电码表: A .- H …. O — V ..…

    python 2023年5月13日
    00
  • Python 实现数组相减示例

    下面是关于“Python 实现数组相减示例”的完整攻略,包含两条示例说明。 简介 在Python中,我们可以使用数组(List)进行数值计算。数组相减是使得两个数组对应元素相减的操作。接下来,我们将介绍如何在Python中实现数组相减。 具体步骤 步骤一:定义两个数组 为了方便演示数组相减,我们首先定义两个数组,分别为A和B,并且他们的长度应该相同,例如: …

    python 2023年6月5日
    00
  • Python获取系统默认字符编码的方法

    获取系统默认的字符编码是Python编程中的常见需求之一。下面是关于Python获取系统默认字符编码的方法的详细攻略: 第一步:导入Python的sys模块 Python中的sys模块提供了许多系统级别的功能,其中包括获取系统默认字符编码的方法。我们可以使用import语句导入sys模块,代码如下: import sys 第二步:使用sys模块中的getde…

    python 2023年5月30日
    00
  • python爬虫的工作原理

    Python爬虫是通过编写程序来自动化访问网页并提取内容的过程。一般而言,爬虫分为以下几个步骤: 1.发送HTTP请求并获取页面内容 爬虫首先发送HTTP请求到目标网站,请求相应的页面。可以使用Python中的requests或urllib库来完成HTTP请求过程,其中requests更为方便、简单易用。 以使用requests库爬取“豆瓣电影Top250”…

    python 2023年5月14日
    00
  • Python Http发送请求浅析

    以下是关于Python Http发送请求浅析的攻略: Python Http发送请求浅析 在Python中,我们可以使用多种方式发送Http请求,如urllib、httplib、requests等。以下是Python Http发送请求浅析的攻略。 使用urllib发送请求 使用Python的urllib库发送Http请求时,可以使用urlopen()方法。以…

    python 2023年5月15日
    00
  • python抖音表白程序源代码

    下面我来为您详细讲解“python抖音表白程序源代码”的完整攻略。 确认环境与安装必要依赖库 要使用抖音表白程序,我们需要确认以下两个前提条件: 安装Python环境,可前往Python官网下载安装:https://www.python.org/downloads/ 安装必要的依赖库,分别是requests与hashlib,可以在命令行中使用以下命令进行安装…

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