码迷,mamicode.com
首页 > 其他好文 > 详细

大顶堆 小顶堆应用----中位数查找

时间:2020-05-30 21:36:43      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:奇数   size   nbsp   大顶堆   return   ret   开始   平均值   大于   

左边大顶堆,右边小顶堆。右边数量比左边多一,左边放小的那半数,右边放大的那半

是偶数个,那就返回两个根堆的头结点的q平均值,如果是奇数,就是小根堆的数量大于大根堆数量1个,返回小根堆的头;

当左右平等数量的时候,往小根堆了加入,当小根堆大于大根堆时候,往大根堆里加入

 1 priority_queue<int> big;
 2 priority_queue<int,vector<int>,greater<int> > small;
 3 void addNum(int num){//左边大顶堆(根节点最大),右边小顶堆(根节点最小),左边放较小数,右边放较大数,保证右边数量比左边大一,所以最开始应向右边堆放入数据,奇数时返回小顶堆根节点,偶数时返回两堆根节点平均值
 4 //数据放入:当右边堆为空时,首先放入右边;
 5 //当右边不为空左边为空,将较小的放入左边------首先将数据放入右边,再将较小数放入左边
 6 if(small.empty())  small.push(num);
 7 else if(big.empty(){
 8 small.push(num);
 9 big.push(small.top());
10 small.pop();
11 }
12 //当两个堆不为空
13 else{
14 if(big.size()==small.size())//当两个堆数量相同,将数据放入大顶堆,将最大的数放入小顶堆
15 {
16 big.push(num);
17 small.push(big.top());
18 big.pop();
19 }
20 else{//将数据放入小顶堆,将其中最小数放入左边堆
21 small.push(num);
22 big.push(small.top());
23 small.pop();
24 }
25 }
26 }
27 double findMedian) {
28 if(big.empty()&&small.empty())  return 0;
29 else if(big.size() == small.size()){
30 double p1 = big.top();
31 double p2 = small.top();
32 return (p1+p2)/2;
33 }
34 else return small.top();
35 }

 

大顶堆 小顶堆应用----中位数查找

标签:奇数   size   nbsp   大顶堆   return   ret   开始   平均值   大于   

原文地址:https://www.cnblogs.com/pengtangtang/p/12994945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!