无序数组取中位数问题

本文探讨了两种解决快速求出无序数组中位数的方法:一是利用快排思想,通过选取基准数并调整数组,递归查找中位数;二是采用堆思想,维护一个大小为n/2的最小堆,通过堆顶元素找到中位数。当序列长度为偶数时,需要额外处理以获取准确的中位数。
摘要由CSDN通过智能技术生成

解决快速求出无序数组的中位数

方法一:快排思想

  • 思想:利用快排思想。
  • 具体解释,其实简单,我们利用的就是一个东西,快排每次选取一个数,然后把比这个数字小的扔到前面,把比这个数字大的数放到前面,那么对取的这个中间数,它的位置一定是正确的,然后我们考虑这个数字的位置,如果比中位数的位置大,就往前面
    那个区间继续找中位数的位置,反之如果中位数的位置,比这个标准位置的位置小,那么一定是在这个数字后面一个区间,这样一直递归的查询下去一定可以查询到最终中位数的位置mid,特判一下序列是偶数,处理一下即可

方法二:堆思想

  • 思想:利用堆的思想
  • 解释:我们只需要维护一个大小为n/2的最小堆,首先1-n/2建立一个基本的堆,然后再利用n/2+1到n树进行维护,维护很简单,如果这个数排序完后在后面,那么这个数的值一定比堆顶元素大,我们把堆顶元素pop掉,维护这样一个最小堆,最后堆顶元素一定是中位数(如果序列长度为偶数,只需要再多维护一个位置,然后取头部两个元素的平均值就是中位数)
  • 方法1
/*  解决快速求出无序数组的中位数
 *  思想:利用快排思想,很简单。
 *    具体解释,其实简单,我们利用的就是一个东西,快排每次选取一个数,然后把比这个数字小的扔到前面,把比这个数字大
 *  的数放到前面,那么对取的这个中间数,它的位置一定是正确的,然后我们考虑这个数字的位置,如果比中位数的位置大,就往前面
 *  那个区间继续找中位数的位置,反之如果中位数的位置,比这个标准位置的位置小,那么一定是在这个数字后面一个区间,这样一直
 *  递归的查询下去一定可以查询到最终中位数的位置mid,特判一下序列是偶数,处理一下即可
 *
 * */
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string.h>
using namespace std;
int PartSort(int *arr,int start,int end)
{
   
    int left = start;
    int right = end;
    int key = arr[end];
    while(left<right)
    {
   
        while(left<right && arr[left]<=key)
        {
   
            ++left;
        }
        while(left<right && arr[right]>=key)
        {
   
            --right
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用PriorityQueue来实现无序数组中位数。PriorityQueue是一个基于优先级堆的无界优先级队列,默认是一个最小堆。具体实现可以参考以下代码: ``` import java.util.PriorityQueue; public class Median { public static double median(int[] array) { int heapSize = array.length / 2 + 1; PriorityQueue<Integer> heap = new PriorityQueue<>(heapSize); for (int i = 0; i < heapSize; i++) { heap.add(array[i]); } for (int i = heapSize; i < array.length; i++) { if (heap.peek() < array[i]) { heap.poll(); heap.add(array[i]); } } if (array.length % 2 == 1) { return (double) heap.peek(); } else { return (double) (heap在Java中,可以使用PriorityQueue来实现无序数组中位数。PriorityQueue是一个基于优先级堆的无界优先级队列,默认是一个最小堆。具体实现可以参考以下代码: ``` import java.util.PriorityQueue; public class Median { public static double median(int[] array) { int heapSize = array.length / 2 + 1; PriorityQueue<Integer> heap = new PriorityQueue<>(heapSize); for (int i = 0; i < heapSize; i++) { heap.add(array[i]); } for (int i = heapSize; i < array.length; i++) { if (heap.peek() < array[i]) { heap.poll(); heap.add(array[i]); } } if (array.length % 2 == 1) { return (double) heap.peek(); } else { return (double) (heap.poll() + heap.peek()) / 2.0; } } public static void main(String[] args) { int[] array = new int[]{12, 34, 1, 209, 17, 900, -10}; System.out.println(median(array)); } } ``` 其中,首先定义了一个大小为数组长度一半加一的最小堆,然后将数组的前一半元素加入堆中。接着,遍历数组的后一半元素,如果当前元素比堆顶元素大,则将堆顶元素弹出,将当前元素加入堆中。最后,如果数组长度为奇数,则中位数就是堆顶元素;如果数组长度为偶数,则中位数就是堆顶元素和次顶元素的平均值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值