使用2个堆,一个小顶堆一个大顶堆。保持大顶堆的最大元<=小顶堆的最小元,且元素个数小顶堆>=大顶堆但是至多相差1
这样如果有奇数个元素中位数就是小顶堆的最小元(堆顶)
在push的时候注意保持上面条件.另外注意处理空的情况
#include<string> #include<stdio.h> #include<queue> #include<algorithm> class two_heaps{ public: std::priority_queue<int,std::vector<int>,std::greater<int>>min_heap; std::priority_queue<int>max_heap; //min_heap的最小元>=max_heap的最大元,元素个数min_heap>=max_heap且至多差1 void push(int a){ //首次push放入min_heap if(min_heap.size()==0){ min_heap.push(a); return; } //第二次push else if(max_heap.size()==0){ if(a>=min_heap.top()){ max_heap.push(a); return; } else{ max_heap.push(min_heap.top()); min_heap.pop(); min_heap.push(a); } } int max_element_in_min_heap=min_heap.top(); int min_element_in_max_heap=max_heap.top(); if(a<=max_element_in_min_heap){ max_heap.push(max_element_in_min_heap); min_heap.pop(); min_heap.push(a); } else if(a<=min_element_in_max_heap){ if(min_heap.size()>max_heap.si***_heap.push(a); else max_heap.push(a); } else{ min_heap.push(min_element_in_max_heap); max_heap.pop(); max_heap.push(a); } } double get(){ size_t total_si***_heap.size()+max_heap.size(); if(total_size%2)return min_heap.top(); else if(total_size==0)return 0; else return (min_heap.top()+max_heap.top())/2.0; } }; int main() { two_heaps a; printf("%.2f\n",a.get()); a.push(1); printf("%.2f\n",a.get()); a.push(2); printf("%.2f\n",a.get()); a.push(1); printf("%.2f\n",a.get()); return 0; }
priority_queue自定义comparator
我们知道可以对priority_queue<t>中的class T重载operator<
但是如果要用一个额外的comparator的形式,由于comparator是模板参数的一部分而不是构造函数的一部分,声明方式与Java不同
template<
class T,
class Container = std::vector<t>,
class Compare = std::less</t></t>
class priority_queue;
auto cmp=[](const int a,const int b){return b<a;};
std::priority_queue<int,std::vector<int>,decltype(cmp)>pq(cmp);
注意cmp必须同时作为构造函数参数传入否则报错如下
error: use of deleted function ‘<lambda(int, int)>::<lambda>()’
priority_queue(const _Compare& __x = _Compare()</lambda></int>
当我们没有将cmp传递给构造函数的时候,会试图调用decltype(cmp)这个类型的默认构造函数来构造一个与cmp类型相同的对象,但是lambda的默认构造函数是deleted所以报错