为什么要采用这种方法呢?
时间效率很高
时间复杂度:O(N*logK)
空间复杂度:O(K)
- void PrintTopK(const char* filename, int k)
- {
- // 1. 建堆--用a中前k个元素建堆
- FILE* fout = fopen(filename, "r");
- if (fout == NULL)
- {
- perror("fopen fail");
- return;
- }
-
- int* minheap = (int*)malloc(sizeof(int) * k);
- if (minheap == NULL)
- {
- perror("malloc fail");
- return;
- }
-
- for (int i = 0; i < k; i++)
- {
- fscanf(fout, "%d", &minheap[i]);
- }
-
- // 前k个数建小堆
- for (int i = (k - 2) / 2; i >= 0; --i)
- {
- AdjustDown(minheap, k, i);
- }
-
-
- // 2. 将剩余n-k个元素依次与堆顶元素交换,不满则则替换
- int x = 0;
- while (fscanf(fout, "%d", &x) != EOF)
- {
- if (x > minheap[0])
- {
- // 替换你进堆
- minheap[0] = x;
- AdjustDown(minheap, k, 0);
- }
- }
-
-
- for (int i = 0; i < k; i++)
- {
- printf("%d ", minheap[i]);
- }
- printf("\n");
-
- free(minheap);
- fclose(fout);
- }