java 计算中位数的实现方法

yizhihongxing

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内置函数count()。 首先,我们需要将数组定义为一个Python的列表。然后,使用列表的count()方法,指定要查询的元素,即可得到该元素在列表中的个数。 下面是一些示例说明: 示例1: arr = [1, 2, 3, 4, 1, 1, 2] num_of_ones = arr.c…

    python 2023年6月6日
    00
  • 基于python发送邮件的乱码问题的解决办法

    下面是详细讲解“基于Python发送邮件的乱码问题的解决办法”的完整攻略。 问题描述 在使用 Python 发送邮件时,有些情况下邮件的内容会出现乱码,这给邮件的发送和阅读带来了不便。这种乱码通常是由于邮件的编码方式与邮件内容的编码方式不一致所致。 解决方案 解决邮件乱码问题的方法主要有以下两种: 方法一:设置邮件内容的编码方式 在使用 Python 发送邮…

    python 2023年5月20日
    00
  • 关于windos10环境下编译python3版pjsua库的问题

    下面是针对“关于Windows10环境下编译Python3版pjsua库的问题”的完整攻略: 1. 准备工作 在开始编译之前,需要软件和库的支持。以下是需要的软件和库: Python和Pip 需要安装Python 3.x版本和对应的pip包管理器。可以从官方网站(https://www.python.org/downloads/windows/)下载Pyth…

    python 2023年5月13日
    00
  • 将一个NumPy数组转换为一个图像

    将NumPy数组转换为图像需要使用Python中的一些库来实现,比如Pillow和Matplotlib。具体流程如下: 步骤1:安装所需的库 在转换之前,首先需要确保安装了Pillow和Matplotlib库。如果你已经安装过了,则可以跳过此步骤。否则,可以使用以下命令来安装: pip install pillow pip install matplotli…

    python-answer 2023年3月25日
    00
  • Python基于百度AI实现OCR文字识别

    Python基于百度AI实现OCR文字识别攻略 一、前置条件 注册百度AI,获取API Key和Secret Key 安装 Python3,并安装所需第三方库 requests bash pip install requests 二、百度AI接口调用 导入requests库 python import requests 设置请求url和headers信息 p…

    python 2023年5月18日
    00
  • python基础之函数的定义和调用

    当然,我很乐意为您提供“Python基础之函数的定义和调用”的完整攻略。以下是详细步骤和示例。 函数的定义和调用 在Python,函数是段可重用的代码块,用于执行特定的任务。函数可以接受参数,并可以返回值。函数的定义和调用是Python编程中的基本概念之一。 函数定义 在Python中可以使用def关键字来定义函数。函数定义的基本语法如下: def func…

    python 2023年5月13日
    00
  • Python干货实战之逆向登录世界上最大的游戏平台Stream

    Python干货实战之逆向登录世界上最大的游戏平台Stream 什么是逆向登录? 逆向登录是通过破解网站的登录机制,模拟网站的登录操作,从而实现程序的自动登录。 Stream游戏平台的登录机制 Stream平台的登录机制主要分为两个部分:一是获取登录表单,二是提交登录请求。 首先需要获取登录表单。通过浏览器的开发者工具可以发现,登录表单的URL为:https…

    python 2023年6月3日
    00
  • 图文详解WinPE下安装Python

    图文详解WinPE下安装Python 本文将会为您详细介绍如何在WinPE下安装Python环境。 什么是WinPE? Windows Pre-installation Environment (Windows PE 或 WinPE) 是基于 Windows NT 的嵌入式根文件系统以及可以启动计算机的最小化操作系统。它主要用于新安装 Windows 操作系…

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