本题源自剑指offer
----------------------------------------------------------------------
用两个堆来解决这个问题 1用最大堆存储左半部分的数,用最小堆存储有半部分的数据,若有奇位个数,中位数就是最小堆的堆顶,否则为最大堆和最小堆堆顶的平均数。
如果当前数据流中的数为偶数个,则新数据插入最小堆,否则插入最大堆。保证最小堆中的数比最大堆的数大。
void Insert(int num)
{
//总数目为偶数时,插入最小堆,否则插入最大堆,最大堆的数字都比最小堆的小
if(((max.size()+min.size())&1)==0){
if(max.size()>0&&max[0]>num){
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());
num=max[0];
pop_heap(max.begin(),max.end(),less<int>());
max.pop_back();
}
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
}else{
if(min.size()>0&&num>min[0]){
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
num=min[0];
pop_heap(min.begin(),min.end(),greater<int>());
min.pop_back();
}
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());
}
}
double GetMedian()
{
int size=min.size()+max.size();
if(size==0)
return -1.0;
if(size&1){
return min[0];
}
return (double)(min[0]+max[0])/2;
}