find and maintain the median value as new values are generated
#include <iostream>
#include <functional>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, less<int>> maxHeap; // gist, maxheap should use less<int>
priority_queue<int, vector<int>, greater<int>> minHeap; // minheap should use greater<int>
float get_median(vector<int> &num) {
int N = num.size();
if(N == 0) return 0;
if(N == 1) return num[0];
if(N == 2) return 0.5 * (num[0] + num[1]);
maxHeap.push(min(num[0], num[1]));
minHeap.push(max(num[0], num[1]));
for(int i=2; i<N; i++) {
int top1 = maxHeap.top(), top2 = minHeap.top();
if(num[i] <= top1) maxHeap.push(num[i]);
else minHeap.push(num[i]);
if(maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
}
else if(maxHeap.size() + 1 < minHeap.size()) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}
if(maxHeap.size() == minHeap.size())
return 0.5 * (maxHeap.top() + minHeap.top());
else if(maxHeap.size() > minHeap.size())
return maxHeap.top();
else return minHeap.top();
}
int main()
{
vector<int> num = {1,2,3,4,5,100};
cout << get_median(num);
return 0;
}