it编程 > 软件设计 > 数据结构

【数据结构】详解堆排序当中的topk问题(leetcode例题)

123人参与 2024-08-06 数据结构

前言

leetcode相关题目:215. 数组中的第k个最大元素

如何理解topk问题

当我们第一次接触这个问题时,我们会想到的方法可能是:

在这两个限制下,我们再去直接使用堆排序是不现实的,所以我们需要用一种更巧妙地方式,但代码的本质上仍然不离开堆排序;

代码逻辑

如果你需要找到最小的 k 个元素,只需在创建堆时使用最小堆即可
在这里我们通过堆排序的方法来讲解topk问题;

代码实现

//使用数组的前k个元素构造含有k个元素的小根堆
//从k+1开始遍历,每次和堆顶元素比较,若被遍历到的元素大于堆顶元素,则替换堆顶元素并调整堆,保证堆内的k个元素总是当前最大的k个元素。
void createndate()
{
	// 造数据
	int n = 100000;
	srand(time(0));
	const char* file = "data.txt";
	file* fin = fopen(file, "w");
	if (fin == null)
	{
		perror("fopen error");
		return;
	}

	for (int i = 0; i < n; ++i)
	{
		int x = (rand()+i) % 10000000;
		fprintf(fin, "%d\n", x);
	}

	fclose(fin);
}

void testheap3()
{
	int k;
	printf("请输入k>:");
	scanf("%d", &k);
	int* kminheap = (int*)malloc(sizeof(int) * k);
	if (kminheap == null)
	{
		perror("malloc fail");
		return;
	}
	const char* file = "data.txt";
	file* fout = fopen(file, "r");
	if (fout == null)
	{
		perror("fopen error");
		return;
	}

	// 读取文件中前k个数
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &kminheap[i]);
	}

	// 11:51继续
	// 建k个数的小堆
	for (int i = (k-1-1)/2; i>=0 ; i--)
	{
		adjustdown(kminheap, k, i);
	}

	// 读取剩下的n-k个数
	int x = 0;
	while (fscanf(fout, "%d", &x) > 0)
	{
		if (x > kminheap[0])
		{
			kminheap[0] = x;
			adjustdown(kminheap, k, 0);
		}
	}

	printf("最大前%d个数:", k);
	for (int i = 0; i < k; i++)
	{
		printf("%d ", kminheap[i]);
	}
	printf("\n");
}

在这段代码中:

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

08-06

瑞_数据结构与算法_B树

08-06

【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)

08-06

ID决策树的构造原理

08-06

数据结构 排序算法——选择排序与堆排序_直接选择排序和堆序的区别(1)

08-06

数据结构之排序算法(三)

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论