当前位置: 首页 > news >正文

C语言数据结构—堆的应用及Topk问题

目录

1、堆排序

1、把数组先原地调整成堆

1.1 向上调整

1.2 向下调整

1.3 两种调整方式的时间复杂度分析

2、进行排序

1、堆排序

堆排序即利用堆的思想来进行排序,总共分为两个步骤:
1、建堆
升序:建大堆
降序:建小堆
2、利用堆删除思想来进行排序
建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

堆排序常用方法

1、把数组先原地调整成堆

2、再进行排序

这里我们都调整为大堆

1、把数组先原地调整成堆

1.1 向上调整

1.2 向下调整

1.3 两种调整方式的时间复杂度分析

2、进行排序

排序思路:

1、把根结点和最后一个叶子结点交换,将n减1。

2、再进行调整使其维持堆的结构,一直到n减到1。

void HeapSort(int* a, int n)
{
	// 向下调整成堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;
    //进行堆排序
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

无论使用向上调整还是向下调整,整个排序的时间复杂度都是O(N*logN)

2、解决Topk问题

由堆的性质可知堆的根部结点一定是这个堆的最值(大堆为最大值,小堆为最小值)。

1、用数据集合中前K个元素来建堆

k个最大的元素,则建小堆

k个最小的元素,则建大堆

2、用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素

再通过调整保持堆的结构,不断重复这个操作直到找到前k个数。

相关文章:

  • Dify部署
  • 第一章:项目简介
  • 非结构化数据管理平台如何解决企业数据孤岛问题?
  • 物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)
  • 朝天椒 USB 服务器解决投标CA盾异地连接
  • django框架使用
  • 希尔排序:突破插入排序的局限
  • 嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)
  • 【nginx】nginx.conf配置详解
  • 编写第一个 C++ 程序 – Hello World 示例
  • 【YOLOv8】YOLOv8改进系列(3)----替换主干网络之ConvNeXt V2
  • Nginx的安装和部署以及Nginx的反向代理与负载均衡
  • 芯旺微KF32A156芯片CANFD过滤配置
  • 【数据结构】顺序表和链表
  • PHP Zip 文件处理指南
  • 计算机毕设-基于springboot的人工智能领域复合型人才校企协同培养管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • xcLeigh 博主:全栈领域优质创作者,博客专家
  • LabVIEW 中 codeGenEngine.llb 工具库
  • 简单理解Oracle中的latch
  • bat命令在b站下载单个音视频
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛暨七猫第六届百万奖金现实题材征文大赛征稿启事
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤
  • 韧性十足的中国外贸企业:“不倒翁”被摁下去,还会再弹起来
  • 上海黄浦江挡潮闸工程建设指挥部成立,组成人员名单公布
  • 娃哈哈:调整产销布局致部分工厂停工,布局新产线可实现自主生产,不排除推新品牌
  • 外企聊营商|威能集团:公平环境增“暖”意