优先级队列可以通过数组自己维护优先级,也可以用STL自带的优先级队列priority_queue
#include <queue>
大根堆:priority_queue<int> que 或 priority_queue<int, vector<int>, less<int> > que
小根堆:priority_queue<int, vector<int>, greater<int> > que
关于优先级队列的应用:
1. 取中位数
问题关键在于将所有数据保存在两个优先级队列中,若将所有数据按从小到大顺序排列,较小的部分保存在大根堆中,较大的部分保存在小根堆中,永远保持:大根堆(较小部分)的长度 = 小根堆(较大部分)的长度,或者大根堆(较小部分)的长度 = 小根堆(较大部分)的长度 + 1。从而使得大根堆的顶部是中位数(奇数个数据)或大根堆和小根堆的顶部的平均值是中位数(偶数个数据)。
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
class Solution {
public:
void Insert(int num)
{
if (up.empty()) up.push(num);
else
{
if (up.size() == down.size())
{
if (num <= down.top()) up.push(num);
else
{
up.push(down.top());
down.pop();
down.push(num);
}
}
else
{
if (num >= up.top())
down.push(num);
else
{
down.push(up.top());
up.pop();
up.push(num);
}
}
}
}
double GetMedian()
{
if (up.size() == down.size())
return (up.top() + down.top()) / 2.0;
else
return up.top();
}
private:
priority_queue<int, vector<int>, less<int> > up; // big top
priority_queue<int, vector<int>, greater<int> > down; // small top
};
int main()
{
Solution solution;
vector<int> vec({ 5, 2, 3, 4, 1, 6, 7, 0, 8 });
for (int i = 0; i < vec.size(); ++i)
{
solution.Insert(vec[i]);
cout << solution.GetMedian() << endl;
}
system("pause");
return 0;
}
结果: