无序数组取中位数问题

本文探讨了两种解决快速求出无序数组中位数的方法:一是利用快排思想,通过选取基准数并调整数组,递归查找中位数;二是采用堆思想,维护一个大小为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值