找中位数(用堆维持小的一半数,建立大根堆)

来源:互联网 发布: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;}

原创粉丝点击