对于这个问题,可以有以下思考:
给了多少内存存储这100亿个数据?
先思考:堆排序效率是nlogn,再思考:可以将这些数据切成等份,再从每一份中找出最大前k个数据,但是效率不高。那如果利用堆的性质呢?
小堆堆顶元素最小,先将前k个数建成小堆,那么堆顶元素就是最小的,k+1的数依次与堆顶元素进行比较,如果大于,则K+1与堆顶元素交换,依次循环直至所有数据全部比较完,那么这个堆里存放的是最大的前K 个数。
代码如下:
void HeapInit(Heap* hp, HeapDatatype* a, int n)//堆的初始化
{
assert(a&&hp);
hp->capacity = n;
hp->size = n;
hp->arry = (HeapDatatype*)malloc(sizeof(HeapDatatype)*hp->capacity);
int i = 0;
for (i = 0; i < hp->size; i++)
hp->arry[i] = a[i];
}
void SmallHeapMake(Heap* hp,int k)//小堆的创建
{
int i = 0;//从大堆最后一个非叶子结点开始
for (i = (k - 1 - 1) / 2; i >= 0; i--)
{
SmallHeapAdjustDown(hp, i,k);
}
}
void SmallHeapAdjustDown(Heap*hp,