当前位置: 首页 > 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个数。

http://www.dtcms.com/a/38374.html

相关文章:

  • 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站下载单个音视频
  • 【GO】学习笔记
  • leetcode_动态规划/递归 509. 斐波那契数
  • 【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新
  • ROS2 强化学习:案例与代码实战
  • flutter: table calendar笔记
  • Log | Hugo+PaperMod+Github创建自己的博客网站
  • 京东web 详情 cfe滑块分析
  • 电脑键盘知识
  • uniapp从入门到精通(全网保姆式教程)~ 别再说你不会开发小程序了
  • Kubernetes集群状态检查与告警整合的自动化