用堆获取中位数
//获取中位数
#include<queue>
#include<stdio.h>
class MedianFinder{
public:
std::priority_queue<int, std::vector<int>, std::less<int> > big_queue;
std::priority_queue<int, std::vector<int>, std::greater<int> > small_queue;
void add_num(int num){
if (big_queue.empty()){
big_queue.push(num);
return;
}
if(big_queue.size()==small_queue.size()){
if(num<big_queue.top()){
big_queue.push(num);
}
else{
small_queue.push(num);
}
}
else if(big_queue.size()>small_queue.size()){
if(num>big_queue.top()){
small_queue.push(num);
}
else{
small_queue.push(big_queue.top());
big_queue.pop();
big_queue.push(num);
}
}
else if(big_queue.size()<small_queue.size()){
if(num<small_queue.top()){
big_queue.push(num);
}
else{
big_queue.push(small_queue.top());
small_queue.pop();
small_queue.push(num);
}
}
}
double find_median(){
if(big_queue.size()==small_queue.size()){
return double(big_queue.top()+small_queue.top())/2;
}
else if (big_queue.size()>small_queue.size()){
return big_queue.top();
}
return small_queue.top();
}
};
int main(){
MedianFinder M;
M.add_num(1);
M.add_num(2);
M.add_num(3);
M.add_num(4);
M.add_num(5);
M.add_num(6);
//M.add_num(7);
printf("%lf\n",M.find_median());
M.add_num(4);
printf("%lf\n",M.find_median());
M.add_num(3);
printf("%lf\n",M.find_median());
return 0;
}