题目:求一个无序数组的中位数。
如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。
- 要求:不能使用排序,时间复杂度尽可能高
- 提示:考虑堆或者快排思想解决。
- 采用堆
将前(size+1)/2个元素创建一个小堆
遍历后序的元素大于小堆堆顶的元素则取代堆顶,否则丢弃
堆顶的元素便是中位数
void FindMidNum1(int *arr, int size)
{
if (NULL == arr || size <= 1)
return;
priority_queue<int,vector<int>,greater<int>> _pq;
for (int i = 0; i <= (size+1)/2; i++)
{
_pq.push(arr[i]);
}
for (int j = (size + 1) / 2 + 1; j < size; j++)
{
int top = _pq.top();
if (arr[j] > top)
{
_pq.pop();
_pq.push(arr[j]);
}