找中位数(用堆维持小的一半数,建立大根堆)
来源:互联网 发布:java httpclient 保持 编辑:程序博客网 时间:2024/05/29 14:35
/*找中位数(用堆维持小的一半数,建立大根堆) 限制内存为2M,而有50W个数字。直接用数组存必定超内存 所以用一个最大为25W的数组做堆,维持一半数字即可 */#include <cstdio>#include <stdlib.h>#include <algorithm>using namespace std;int main(){ int n; scanf("%d", &n); int data[250005]; int half = n/2 +1; int i; for(i=0; i<half; i++) scanf("%d", &data[i]); make_heap(data, data+half); //printf("%d\n", half); while(i < n) { int newData; scanf("%d", &newData); //如果新的值比大根堆的顶端要小,那么就先弹出堆顶,让新的入堆,然后再调整堆 if(newData < data[0]) { pop_heap(data, data+half); data[half-1] = newData; push_heap(data, data+half); } i++ ; } if(n % 2 == 1) printf("%0.1f\n", (float)data[0]); else { int secondMax; if(data[1] > data[2]) secondMax = data[1]; else secondMax = data[2]; printf("%0.1f\n", ((float)data[0]+ (float)secondMax)/2); } system("pause"); return 0;}