解决快速求出无序数组的中位数
方法一:快排思想
- 思想:利用快排思想。
- 具体解释,其实简单,我们利用的就是一个东西,快排每次选取一个数,然后把比这个数字小的扔到前面,把比这个数字大的数放到前面,那么对取的这个中间数,它的位置一定是正确的,然后我们考虑这个数字的位置,如果比中位数的位置大,就往前面
那个区间继续找中位数的位置,反之如果中位数的位置,比这个标准位置的位置小,那么一定是在这个数字后面一个区间,这样一直递归的查询下去一定可以查询到最终中位数的位置mid,特判一下序列是偶数,处理一下即可
方法二:堆思想
- 思想:利用堆的思想
- 解释:我们只需要维护一个大小为n/2的最小堆,首先1-n/2建立一个基本的堆,然后再利用n/2+1到n树进行维护,维护很简单,如果这个数排序完后在后面,那么这个数的值一定比堆顶元素大,我们把堆顶元素pop掉,维护这样一个最小堆,最后堆顶元素一定是中位数(如果序列长度为偶数,只需要再多维护一个位置,然后取头部两个元素的平均值就是中位数)
- 方法1
#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