STL適配器:
heap、priority_queue 默認是 vector 實現的最大堆
stack,queue默認是 dequeue 實現的
注意top,pop時,需判斷空的情況!
試用一個最大堆和一個最小堆,保持兩個最大堆中所有數小於最小堆,且保證兩個堆元素個數相差不超過1。
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <queue>
#include <functional>
using namespace std;
//stl中,棧默認使用雙端隊列實現,堆和優先隊列默認使用vector實現
priority_queue<int, vector<int>, less<int>> min_que;
priority_queue<int, vector<int>, greater<int>> max_que;
void Insert(int num)
{
if (min_que.size() < max_que.size())
{
min_que.push(num);
}
else
{
max_que.push(num);
}
if ((!min_que.empty() && !max_que.empty()) && min_que.top() > max_que.top())//注意判斷是否爲空
{
int tmp1 = min_que.top();
int tmp2 = max_que.top();
min_que.pop();
max_que.pop();
min_que.push(tmp2);
max_que.push(tmp1);
}
}
double GetMedian()
{
//注意判斷爲空的情況
if (min_que.empty()&&max_que.empty())
{
return -1;
}
if (min_que.empty())
{
return max_que.top();
}
else if (max_que.empty())
{
return min_que.top();
}
if (min_que.size() == max_que.size())
{
return ((double)(min_que.top() + max_que.top()) / 2);
}
else if (min_que.size() < max_que.size())
{
return max_que.top();
}
else
{
return min_que.top();
}
}
int main()
{
cout<<GetMedian()<<endl;
for (auto i = 0; i < 100; i++)
{
Insert(i);
cout << GetMedian() << endl;
}
return 0;
}