🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
之前我们讲到了堆排序的实现逻辑,那么接下来我们重点关注的就是其中的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;
}
在这个代码当中有几个比较厉害的点需要我们注意一下,首先在他的创建数据的那个阶段,我们使用了随机数,但是它那里进行了取余,这样的好处是将数字的范围控制在一个程度之内,可以检测自己的程序是否正确表达。
接下来可能需要注意的就是相关文件的操作