关于堆排序的topk问题

关于堆排序的topk问题
我们需要在n个数据中查找最大的前k个数考虑到数据的过大会导致内存不够用因此先建k个数的小堆再把n-k个数的数据逐个比较堆顶的数如果比堆顶的数大代替它进堆从而得出n个数据中查找出最大的前k个数voidAdjustDown(HP_Data*a,intn,intparent)//向下调整建堆{HP_Data childparent*21;//计算child的位置默认为左边while(childn){if(child1na[child1]a[child])//为防止计算右边child1的值越界加上条件chikd1n{child;}if(a[child]a[parent])//当child大于parent时进行交换{Swap(a[child],a[parent]);parentchild;childparent*21;}else{break;//childparent退出}}}voidPrintTopK(constchar*file,intk){int*topkmalloc(sizeof(int)*k);assert(file);FILE*foutfopen(file,r);for(inti0;ik;i){fscanf(fout,%d,topk[i]);}for(inti(k-1-1)/2;i0;i--)//向下调整建堆---O(N){AdjustDown(topk,k,i);}intval0;intretfscanf(fout,%d,val);while(ret!EOF){if(valtopk[0]){topk[0]val;AdjustDown(topk,k,0);}retfscanf(fout,%d,val);}for(inti0;ik;i){printf(%d ,topk[i]);}printf(\n);free(topk);fclose(fout);}