🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
之前我们讲到了堆排序的实现逻辑,那么接下来我们重点关注的就是其中的T-TOK问题
T-TOK说简单点,就是说,假如有10000个数据(随机的),让你找到其中最大的10个数据,有什么快速的方法,遍历吗?这个是不显示的,效率是最低的
所以,我们能想到的比较好的方法就是堆排序当中的T-TOK问题
首先,我们传入100000
#define _CRT_SECURE_NO_WARNINGS
#include"Heap.h"
void CreateNDate()
{//造数据int n = 100000;srand(time(0));const char* file = "data.txt";FILD* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; i++){int x = (rand() + i) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);}
void topk()
{printf("请输入k: >");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc fail");return;}for (int i = 0; i < k; i++){fsanf(fout, "%d", &minheap[i]);}//建立k个数据的小堆for (int i = (k - 1 - 1) / 2; i > 0; i--){AdjustDown(minheadp, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){//读取堆顶的数据if (x > minheap[0]){minheadp[0] = x;AdjustDown(minheap, k, 0);}for (int i = 0; i < k; i++){printf("%d", minheap[i]);}fclose(fout);}}
int main()
{CreateNDate();topk();return 0;
}
在这个代码当中有几个比较厉害的点需要我们注意一下,首先在他的创建数据的那个阶段,我们使用了随机数,但是它那里进行了取余,这样的好处是将数字的范围控制在一个程度之内,可以检测自己的程序是否正确表达。
接下来可能需要注意的就是相关文件的操作