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 ;
}

 

posted on 2011-12-15 23:06 lzhenf 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lzhenf/archive/2011/12/15/2289548.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值