如果不限定条件的话,这个问题还是很好解决的,但是当我们要求时间复杂度为O(N),空间复杂度为O(1)时,问题就没那么好解决了。


简单的思路就是,创建一个大小为K=100的小堆,调整好,然后从K开始拿十万个数据一个一个跟堆头比较,如果比堆头大,就入堆,然后调整成最小堆,一直循环到第N=100000个数据。

voidAdjustDown(int*_a,size_tsize,inti){intparent=i;intchild=2*parent+1;while(child<size){//找出孩子中的最小值if(child+1<size&&_a[child+1]<_a[child]){++child;}//与父节点做比较if(_a[parent]>_a[child]){swap(_a[parent],_a[child]);parent=child;child=parent*2+1;}else{break;}}}//找N个数据中的最大K个int*GetKTop(int*a,size_tsize,size_tn){int*_a=newint[size];for(inti=0;i<size;i++){_a[i]=a[i];}//建堆for(inti=(size-2)/2;i>=0;i--){AdjustDown(_a,size,i);}for(inti=0;i<n-size;i++){if(_a[0]<a[size+i]){_a[0]=a[size+i];AdjustDown(_a,size,0);}}return_a;}void_AdjustDown(int*a,size_tsize,inti){intparent=i;intchild=2*parent+1;while(child<size){//找出孩子中的最大值if(child+1<size&&a[child]<a[child+1]){++child;}//拿父节点与最大子节点做比较if(a[parent]<a[child]){swap(a[parent],a[child]);parent=child;child=2*parent+1;}else{break;}}}