堆排序以及向上、向下调整算法的时间复杂度推导及实现(超详细)

news2024/11/24 20:04:15

什么是堆排序?

堆排序是由堆这种数据结构所设计的一种排序算法

堆的分类:

大根堆:每个父结点的值都大于子结点

小根堆 :每个父结点的值都小于子结点

 

在了解完堆之后,需要先了解建堆,建堆有向上建堆建大堆或者小堆,也有向下建堆建大堆或者小堆 

建大堆还是小堆看子结点和父结点的比较关系是大于还是小于

 向上调整算法

新数据插⼊到数组的尾上,再进行向上调整算法,直到满⾜堆。

• 先将元素插⼊到堆的末尾,即最后⼀个孩⼦之后 

• 插⼊之后如果堆的性质遭到破坏,将新插⼊结点顺着其双双亲往上调整到合适位置即可

 

void swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
 
//建大堆还是小堆将两个算法的第一个判断条件修改相反即可
//向上调整
void AdjustUp(HPDataType* arr,int child)
{
	int parent = (child - 1) / 2;//根据子结点求父结点
	while (child > 0)//直到子结点为根结点即循环停止
	{
//                     >
		if (arr[child] < arr[parent])//子结点小就交换,创建小堆
		{
			swap(&arr[child], &arr[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

 向上调整算法时间复杂度计算推导

第1层,2^0个结点,需要向上移动0层

第2层,2^1个结点,需要向上移动1层

第3层,2^2个结点,需要向上移动2层 

第4层,2^3个结点,需要向上移动3层

..............................................................

第h层,2^(h-1)个结点,需要向上移动h-1层

则需要移动结点总的移动步数为:每层结点个数  *  向上调整次数(第⼀层调整次数为0) 

由此可得:

向上调整算法建堆时间复杂度为:O(n ∗ log2 n)

因为堆是完全⼆叉树,⽽满⼆叉树也是完全⼆叉树,此处为了简化使⽤满⼆叉树来证明(时间复杂度本 来看的就是近似值,多⼏个结点不影响最终结果)

向下调整算法

堆的删除:

删除堆是删除堆顶的数据,将堆顶的数据根最后⼀个数据⼀换,然后删除数组最后⼀个数据,再进⾏向下调整算法。

• 将堆顶元素与堆中最后⼀个元素进⾏交换

• 删除堆中最后⼀个元素

• 将堆顶元素向下调整到满⾜堆特性为⽌  

//向下调整
void AdjustDown(HPDataType* arr, int parent, int n)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		//小堆:找左右孩子中找最小的
		//大堆:找左右孩子中找大的
//                                      <
		if (child + 1 < n && arr[child] > arr[child + 1])
		{
			child++;
		}
//                     >
		if (arr[child] < arr[parent])  //小堆,什么时候交换? 孩子比父亲小
		{
			swap(&arr[child], &arr[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HPPop(HP* php)
{
     assert(php);
     assert(php->size > 0);
     Swap(&php->a[0], &php->a[php->size - 1]);
     php->size--;
     AdjustDown(php->a, php->size, 0);
}

 向下调整算法时间复杂度计算推导

第1层,2^0个结点,需要向下移动h-1层 

第2层,2^1个结点,需要向下移动h-2层

第3层,2^2个结点,需要向下移动h-3层

第4层,2^3个结点,需要向下移动h-4层

......

第h-1层,2^(h−2)个结点,需要向下移动1层 

则需要移动结点总的移动步数为:每层结点个数  *  向下调整次数

向下调整算法建堆时间复杂度为:O(n) 

堆排序的应用

//堆排序
void HeapSort(int* arr, int n)
{
	//建堆
	//升序——大堆
	//降序——小堆
	//向上调整算法建堆
	//for (int i = 0; i < 6; i++)
	//{
	//	AdjustUp(arr, i);
	//}


	//向下调整算法建堆
	//for (int i = (n - 1- 1) / 2; i >= 0; i--)
	//{
	//	AdjustDown(arr, i, n);
	//}

	//循环将堆顶数据和最后一个数据进行交换
	int end = n - 1;
	while (end > 0)
	{
		swap(&arr[0], &arr[end]);
		AdjustDown(arr, 0, end);
		end--;
	}
}

堆排序时间复杂度计算  

第1层,2^0个结点,交换到根结点后,需要向下 移动0层

第2层,2^1个结点,交换到根结点后,需要向下 移动1层

第3层,2^2个结点,交换到根结点后,需要向下 移动2层

第4层,2^3个结点,交换到根结点后,需要向下 移动3层

......

第h层,2^(h-1)个结点,交换到根结点后,需要向 下移动h-1层

 通过分析发现,堆排序第⼆个循环中的向下调整与建堆中的向上调整算法时间复杂度计算⼀致,此处 不再赘述。因此,堆排序的时间复杂度为O(n + n ∗ log n) ,即(n log n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb——CSS的使用

CSS 层叠样式表(英文全称:(cascading stle sheets)能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有对网页对象和模型样式编辑的能力,简单来说,CSS用来美化页面 一、CSS的引入方式: 1.行内式&#xff1a;通过元素开始标…

清除 Nuxt 数据缓存:clearNuxtData

title: 清除 Nuxt 数据缓存&#xff1a;clearNuxtData date: 2024/8/6 updated: 2024/8/6 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt.js框架中的clearNuxtData方法&#xff0c;用于清除useAsyncData和useFetch缓存的数据、错误状态和待处理promises&am…

Sentine 源码分析之--AuthoritySlot、SystemSlot、GatewayFlowSlot

前言&#xff1a; 上一篇我对 Sentinel 中统计数据部分的 NodeSelectorSlot、ClusterBuilderSlot、StatisticSlot 的相关源码进行了分析&#xff0c;本篇我们开始分析规则相关的源码。 Sentinel 系列文章传送门&#xff1a; Sentinel 初步认识及使用 Sentinel 核心概念和工…

国家机构选用NAS存储的要求是什么?

西北航天基地采用Infortrend NAS存储做影视后期及共享 国家机构航天基地每天都有升空任务&#xff0c;记录下的视频数据分发给对应的项目组的NAS存储设备上&#xff0c;方便每个项目组做分析总结、对外宣传及学术交流的使用需求&#xff0c;因此选用了Infortrend桌面级NAS存储…

数据采集器与条码扫描器的区别

在条码二维码的应用领域中&#xff0c;数据采集器和条码扫描器是其应用过程两种核心硬件设备&#xff0c;均具备独特的功能与应用场景&#xff0c;您是否真正了解数据采集器和条码扫描器之间的细微差别&#xff1f;这一区别对于您的项目开发成本和工作效率提升有着至关重要的影…

VM16中安装Linux虚拟机

VM16下安装Linux虚拟机 注意这里只安装虚拟机&#xff0c;并没有按照Linux操作系统&#xff0c;按装操作系统请看后续文章 点击“创建新的虚拟机” 选择自定义创建虚拟机 选择虚拟机的硬件兼容性 暂时不选择系统镜像文件我们选择稍后安装 选择操作系统类型和版本 命…

PEER:基于高效专家检索的Transformer模型扩展新方法

谷歌DeepMind提出了一种名为PEER的参数高效专家检索机制&#xff0c;利用产品密钥技术从超过百万个微型专家库中进行稀疏检索&#xff0c;从而提高模型效率和性能&#xff0c;有效解决了Transformer模型规模扩展带来的计算挑战。 论文介绍 在 Transformer 架构中&#xff0c;计…

ADC的一些细节2

一&#xff0c;转换时间 ADC 是挂载在 APB2 总线&#xff08;PCLK2&#xff09;上的&#xff0c;经过分频器得到 ADC 时钟&#xff08;ADCCLK&#xff09;&#xff0c;最高 14 MHz。 转换时间采样时间12.5个周期 12.5个周期是固定的&#xff0c;一般我们设置 PCLK272M&#x…

基于CentOS Stream 9平台搭建Nacos2.4.0.1集群,并使用OpenResty反向代理集群

目录展示 Nacos2.4.0.1集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源 修改端口去掉前面的#注释&#xff08;修改数据库地址、数据库用户名、密码&#xff09;If use MySQL as datasource:Count of DB:Connect URL of DB:密钥鉴…

空气质量传感器 - 从零开始认识各种传感器【第二十八期】

空气质量传感器|从零开始认识各种传感器 1、什么是空气质量传感器&#xff1f; 空气质量传感器是一种检测空气中污染物浓度的设备&#xff0c;广泛应用于环境监测、智能家居、工业控制和健康管理等领域。 2、空气质量传感器是如何工作的&#xff1f; 对于每个人都关心的空气质…

java学习day17MyBatis

Mybatis 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作 MyBatis支持定制化SQL、存储过程以及高级映射&#xff0c;可以在实体类和…

【socket编程】预备知识 {IP地址和MAC地址;端口号;认识TCP/UDP协议;网络字节序;socket编程入门}

一、IP地址和MAC地址 源IP地址和目的IP地址 IP地址用于唯一标识网络中的一台主机在IP数据包头部中&#xff08;网络层&#xff09;, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址这两个地址在网络传输过程中是不变的&#xff0c;因为它们是数据包的一部分&#xff0c;并且用…

Serverless 1

一、云原生应用 云原生应用覆盖到&#xff1a; 大数据&#xff0c;人工智能&#xff0c;边缘计算&#xff0c;区块链等 服务代理&#xff1a;envoy API 网关&#xff1a;APISIX 服务网格&#xff1a;Istio 服务发现&#xff1a;CoreDNS 消息和流式处理&#xff1a;kafka Serve…

打造高效校园办公:智慧校园行政办公合同类型

智慧校园行政办公中的合同类型功能是为了满足校园内各种合同管理需求而设计的一套数字化管理系统。该功能旨在提高合同管理效率&#xff0c;简化合同处理流程&#xff0c;确保合同内容的准确性和合规性。 智慧校园行政办公中的合同类型功能支持多种类型的合同管理&#xff0c;包…

【书生大模型实战营第三期 | 基础岛第1关-书生大模型全链路开源体系】

学习心得&#xff1a;《书生浦语大模型全链路开源开放体系》 摘要 通过观看哔哩哔哩上的《书生浦语大模型全链路开源开放体系》视频&#xff0c;我对开源大模型及其工具链有了更深入的了解。视频由社区贡献者汪周谦讲解&#xff0c;不仅介绍了书生浦语大模型的架构和功能&…

Excel公式与函数(运算符,计算限制,错误检查)(一)

公式 公式概念 公式 是以“”号为引导&#xff0c;用过运算符按照一定的顺序组合进行数据运算处理的等式&#xff0c;函数 则是按特定算法执行计算的产生一个或一组结果的预定义的特殊公式。 公式组成要素 公式的组成要素为“”&#xff0c;运算符&#xff0c;单元格引用&a…

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能&#xff1a; 【1】能够采集本地环境的温度、湿度、烟雾浓度&#xff0c;火光信息&#xff0c;在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…

LE-50821F/FA激光扫描传感器|360°避障雷达之性能参数与配置清单说明

LE系列激光扫描传感器|360避障雷达涵盖LE-50711、LE-50711F、​ LE-50621、LE-50821F、​LE-50621F、LE-50821FA、LE-50711FA、LE-50621FA等型号&#xff0c;广泛应用于自动化工厂、物流与仓储、汽车制造与物流、机械设备、能源与环境等领域的环境感知、高精度定位&#xff08;…

【dockerpython】亲测有效!适合新手!docker创建conda镜像+容器使用(挂载、端口映射、gpu使用)+云镜像仓库教程

文章目录 docker基本概念简介配置镜像加速源创建conda镜像1. 写 Dockerfile文件2. 创建镜像3. 创建容器并测试 容器的使用1. wsl挂载2. 端口映射3. 补充-gpu 云镜像仓库使用1. 登录2. 将本地镜像上传至云镜像仓库3. 从云镜像仓库下载镜像到本地 docker基本概念简介 简单来讲&a…

2024年“华数杯”数学竞赛A题完整解析 | 代码分享

机器臂关节角路径的优化设计 问题一 代码 Matlab clc clear % 参数定义 a [0, 300, 1200, 300, 0, 0]; alpha [0, -90, 0, -90, -90, -90]; d [600, 0, 0, 1200, 0, 0]; theta_min [-160, -150, -200, -180, -120, -180]; theta_max [160, 15, 80, 180, 120, 180]; P_t…