sicily小内存找中位数

/*
sicily 一道找中位数的题目
条件限制是内存小 , 不足以存下全部数字
2M的内存空间 , 最大数目去到 500000 ;
初略估算 : 一个Int 4个字节
4 * 500000 = 2000000个字节 , 1MB = 1024 * 1024 个字节 = 1048576个字节
2Mb就是 208000个字节 , 如果把所有数字都存放的话 , 在没有空间运行程序了 。
因此考虑建一个堆 , 但是堆的大小只有 N/2 , 这样的话 , 还有1MB的运行空间 ,
当后一半数据输入的时候,动态把堆的其中无用节点弹出,新的数值插入堆。

*/

#include <stdio.h>
#include <algorithm>

using namespace std;

int a[250005];
//保持堆特性函数,非递归写法
void max_heapify( int i, int length)
{
int largest = i;
while(largest <= length - 1)
{
int left = 2*largest + 1;
int right = 2*largest + 2;
int temp = largest;
if( left <= length - 1 && a[left] > a[largest])
{
largest = left;
}
if(right <= length - 1 && a[right] > a[largest])
{
largest = right;
}
//最小的元素位置错误 , 交换其位置 , 使其正确
if(largest != temp)
{
int exchange = a[largest];
a[largest] = a[temp];
a[temp] = exchange;
}
else
break;
}
}
int main()
{
int n , size , temp ;

scanf("%d" , & n );
size = n / 2 + 1 ;
for ( int i = 0 ; i < size ; i ++ )
scanf("%d" , a + i );
make_heap( a , a + size );

for ( int i = 0 ; i < n - size ; i ++ )
{
scanf("%d" , & temp );
if ( temp < a[0] )
{
a[0] = temp;
max_heapify( 0 , size ) ;
}
}
if ( n % 2 != 0 )
{
float d1 = a[0] ;
printf( "%.1f\n" , d1 );
}
else
{
float d1 = a[0] ;
float d2 ;
d2 = max( a[1] , a[2] ) ;
printf("%.1f\n" , (d1+d2) / 2.0 ) ;
}


return 0 ;
}
原文地址:https://www.cnblogs.com/lzhenf/p/2289548.html