您的位置:首页 > 其它

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

2013-01-05 15:39 232 查看
/*找中位数(用堆维持小的一半数,建立大根堆)
限制内存为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: