template<typename T>
class Heap
{
private:
vector<T> min;
vector<T> max;
public:
void Insert(T num)
{
if(((min.size()+max.size())&1)==0)//偶数插入左边最大堆;
{
if(max.size()>0 && num<max[0])
{
max.push_back(num);
push_heap(max.begin(),max.end(),less<T>());
num=max[0];
pop_heap(max.begin(),max.end(),less<T>());
max.pop_back();
}
min.push_back(num);
push_heap(min.begin(),min.end(),greater<T>());
}
else //奇数插入右边最小堆;
{
if(min.size()>0&&num>min[0])
{
min.push_back(num);
push_heap(min.begin(),min.end(),greater<T>());
num=min[0];
pop_heap(min.begin(),min.end(),greater<T>());
min.pop_back();
}
max.push_back(num);
push_heap(max.begin(),max.end(),less<T>());
}
}
T get_median()
{
int size=min.size()+max.size();
if(size==0)
throw exception("no numbers are available");
T median=0;
if((size&1)!=0) //如果是奇数返回最小堆的第一个元素;
{
median=min[0];
}
else //如果是偶数则返回中间两个数的平均值;
{
median=(max[0]+min[0])/2;
}
return median;
}
};
热门源码