sundeepblue
2/12/2014 - 5:00 AM

find and maintain the median value as new values are generated

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;
}