题目描述:

给一个源源不断的数据流,每次输入一个数输出现有数字的中位数

分析: 采用优先级队列构造一个大根堆,一个小根堆,输入的数据存入大根堆或者小根堆,当两个堆的数据数量大于1时,存入数量少的堆,因为大根堆和小根堆是有大小的,中位数就在堆顶产生,那个堆数据多一个,中位数就是那个堆顶元素,如果两个堆数量相等,就取各自的堆顶元素求平均数即是中位数。

#include<iostream>
#include<functional> 
#include<queue>
#include<vector>
using namespace std;

int main(){
	priority_queue<int, vector<int>, less<int> > que1;//大根堆 
	priority_queue<int, vector<int>, greater<int> >que2;//小根堆 
	int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
/*	for(int i=0;a[i];i++){
		que1.push(a[i]);
	}
	*/
	for(int i=0;a[i];i++){
		que1.push(a[i]);
		if(que1.size() - que2.size() >1){
			int k = que1.top();
			que1.pop();
			que2.push(k);
		}
		if(que1.empty()){
			cout<<que2.top()<<endl;
		}
		else if(que2.empty()){
			cout<<que1.top()<<endl;
		}else
		cout<<(que1.top() + que2.top())/2<<endl;
	}

/*	while(!que1.empty()){
		printf("%d",que1.top());
		que1.pop();
		cout<<"\n";
		}
		
		cout<<"\n";
	while(!que2.empty()){
		printf("%d",que2.top());
		que2.pop();
		cout<<"\n";
		}
*/
}