数据结构系列-堆排序当中的T-TOK问题

发布于:2024-05-01 ⋅ 阅读:(158) ⋅ 点赞:(0)

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

之前我们讲到了堆排序的实现逻辑,那么接下来我们重点关注的就是其中的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;
}

在这个代码当中有几个比较厉害的点需要我们注意一下,首先在他的创建数据的那个阶段,我们使用了随机数,但是它那里进行了取余,这样的好处是将数字的范围控制在一个程度之内,可以检测自己的程序是否正确表达。

接下来可能需要注意的就是相关文件的操作

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到