这道题是用最大堆和最小堆来实现的问题。难度颇大。现在我先着重搞明白之中的代码是怎么回事。
//test 64 数据流中的中位数 template<typename T> class DynamicArray { 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>());//std::pop_heap将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。 max.pop_back(); } min.push_back(num); push_heap(max.begin(), max.end(), less<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 GetMedian() { int size = min.size() + max.size(); if (size == 0) throw exception("No numbers are avaiable"); T median = 0; if ((size0x01) == 1) median = min[0]; else median = (min[0] + max[0]) / 2; return median; } } private: vector<T> min; vector<T> max; };