【排序算法】堆排序详解与实现

news2025/3/13 0:03:31

一、堆排序的思想

         堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆(若不清楚什么是堆,可以看我前面的文章,有详细阐述)来进行选择数据,通过向下调整算法,从第一个非叶子结点开始在局部先创建出大堆(或小堆),然后父亲结点不断往上走,直到整棵树都建成一个堆 需要注意的是排升序要建大堆,排降序建小堆。( 然后不断交换根节点和最后一个节点的值,交换完后节点的数目减1(因为最后一个节点已经是它应该在的位置了,不用再参与建堆),再从根节点向下建堆(除最后一个节点其它节点又会建成一个堆) 然后重复红色括号中的过程,堆排序就完成了。

二、堆排序的图解

下图以建大堆为例排一个升序序列

三、堆排序的实现

3.1向下调整算法的实现

实现堆排序最重要的就是实现向下调整算法。以下是向下调整算法的代码以及解释

//这里以建大堆为例
void AdjustDown(int* a, int n, int root)
{
	int child = root * 2 + 1;//找到根节点的左孩子
	while (child < n)//判断左孩子是否出界
	{
		if (child + 1 < n && a[child + 1] > a[child])
			//child + 1 < n判断右孩子是否出界,
			//a[child + 1] > a[child]判断左右孩子的大小,取左右孩子中大的那一个
			child++;
		if (a[child] > a[root])//入过孩子的值比父亲的值大,就交换孩子和父亲的位置
			Swap(&a[child], &a[root]);
		else//如果孩子的值不比父亲的值大,就证明大堆已经建好了(因为此时父亲的左右子树都是大堆),
			//直接break跳出循环。
			break;
		//没有break来到这里就顺着子树继续往下走
		root = child;
		child = root * 2 + 1;
	}
}

3.2堆排序的实现

以下是堆排序的代码实现以及解释

void HeapSort(int* a, int n)
{
	//向下调整建堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		//(n - 1 - 1) / 2找到第一个非叶子节点,从第一个非叶子结点开始向下建堆
		AdjustDown(a, n, i);
	}
	//堆建好了
	int end = n - 1;
	while (end > 0)
	{
		//假设是建大堆,将下标为0的元素和下标为end的元素交换,
		//最大的数就排到最后了,也就相当于最后的那个数已经排好了,不用再参与下面的向下建堆
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);//还没有排好的数向下建堆从0位置开始向下建堆
		end--;
	}
}

四、总结

堆排序的时间复杂度为 O(N*logN) (向下建堆时间复杂度为O(N),排序时间复杂度为O(N*logN)), 空间复杂度:O(1) ,稳定性:不稳定。

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

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

相关文章

投票礼物打赏流量主小程序开发

投票礼物打赏流量主小程序开发 投票功能&#xff1a;用户可以参与投票&#xff0c;选择自己支持的候选人或选项。礼物功能&#xff1a;用户可以给候选人或其他用户送礼物&#xff0c;以表示赞赏或支持。打赏功能&#xff1a;用户可以给候选人或其他用户打赏&#xff0c;以表示…

Transformer预测 | Pytorch实现基于Transformer的时间序列预测(含单步与多步实验)

文章目录 效果一览文章概述模型描述程序设计单步实验多步实验参考资料效果一览 文章概述 Transformer预测 | Pytorch实现基于Transformer的时间序列预测(含单步与多步实验) Transformer-singlestep.py 包含单步预测模型 Transformer-multistep.py 包含多步预测模型 这是单步预…

【kubernetes的三种网络】

kubernetes的三种网络 一、三种网络service网络&#xff08;service是虚拟IP地址&#xff09;pod网络&#xff08;pod的IP地址 docker容器的IP&#xff09;节点网络&#xff08;网络服务器上的物理网卡IP&#xff09; 二、其他网络flannel一、vxlan(隧道方案)1.定义2.优势3.工作…

软件定制开发的细节|网站搭建|APP小程序定制

软件定制开发的细节|网站搭建|APP小程序定制 在定制开发的过程中&#xff0c;一些小的细节往往能够影响到最终的产品质量和用户体验。下面我将为大家介绍一些软件定制开发的细节。 第一&#xff0c;明确需求。在定制开发之前&#xff0c;我们需要明确客户的需求和目标。只有明确…

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录 写在前面1. strlen1.1 函数介绍1.2 模拟实现 2. strcpy2.1 函数介绍2.2 模拟实现 3. strcat3.1 函数介绍3.2 模拟实现 4. strcmp4.1 函数介绍4.2 模拟实现 写在前面 本篇文章介绍了C语言中常用的字符串处理函数&#xff0c;包括strlen、strcpy、strcat和strcmp。文章…

Redis集群方案-主从复制-哨兵模式-分片集群

Redis集群方案 主从复制全量同步增量同步&#xff08;slave重启或者后期数据变化&#xff09; 哨兵模式服务状态监控哨兵选主规则 分片集群哈希槽 主从复制 单节点的Redis的并发能力是有上线的&#xff0c;要进一步提高redis的并发能力&#xff0c;就需要搭建主从集群&#xff…

第一节:vue3 配置路由

1.安装router插件npm install vue-router4或者yarn add vue-router4 2.新建router文件夹以及router里边的index.js&#xff1a;里边主要配置路由 import {createRouter,createWebHashHistory} from vue-router // 1.新的页面导入进来 import Home from ../view/Home.vue impor…

使用华为eNSP组网试验⑹-组建基于BGP的网络

BGP(Border Gateway Protocol -- 边界网关协议)是一种在自治系统之间动态交换路由信息、具有丰富的路由控制机制、稳定而安全的路由协议路由协议&#xff0c;一般部署在骨干(主要、核心)路由器。 BGP适用于大中型网络的组建&#xff0c;在很多企业当中都有应用。 一般情况下&am…

2023年化妆品级珠光材料随化妆品需求增加推动产品需求量[图]

珠光材料是通过特定工艺方法&#xff0c;在天然云母或人工合成等基材表面包覆一层或多层金属氧化物而制得的一种材料。在化妆品领域&#xff0c;珠光颜料常用于口红、眼影、指甲油、粉饼等化妆品的制造&#xff0c;以产品的闪亮度和吸引力&#xff0c;使其更加美观。 化妆品级…

java CPU 或者内存 异常排查

java CPU 或者内存 异常排查 提示&#xff1a;需要基础环境和配置上java-home CPU 或者内存 异常排查 java CPU 或者内存 异常排查前言一、java文件上传&#xff08;Test.java&#xff09;二、转换为class三、执行命令&#xff0c;启动文件四、使用top命令查看五、下载文件&…

【MATLAB源码-第44期】基于matlab的2*2MIMO-LDPC系统的误码率仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 2x2 MIMO&#xff08;多输入多输出&#xff09;和LDPC&#xff08;低密度奇偶校验码&#xff09;编码是在通信系统中常用的技术&#xff0c;它们通常用于提高无线通信系统的性能和可靠性。 1. 2x2 MIMO&#xff1a; 2x2 MIMO…

Micriosoft 365 和 Office 之间的对比

Micriosoft 365 以前也叫做 Office 365&#xff0c;2020 年微软官方将它改名为了 Microsoft 365。

MySQL Cluster 简介

文章目录 1.简介2.组成参考文献 1.简介 MySQL Cluster 是官方推出的基于 NDB&#xff08;Network DataBase&#xff09;存储引擎的高可用和可伸缩的分布式数据库系统。 以下是 MySQL NDB Cluster 的主要特点和能力&#xff1a; 高可用&#xff1a;MySQL Cluster 具有内置的高…

截胡高通,三星Exynos 2400率先登场:旗舰芯片定位。

今年 2 月&#xff0c;三星在全球发布了 GalaxyS23 系列&#xff0c;不同于过去的双处理器策略&#xff0c;Galaxy S23 系列全线搭载了采用台积电4nm 生产的高通骁龙 8 Gen 2&#xff0c;三星自家的 Exynos 2300 则直接轮空——被弃之不用。 但我们在之后的文章中就指出&#x…

物联网AI MicroPython传感器学习 之 WS2812 RGB点阵灯环

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 ws2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同&#xff0c;每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路&a…

基于vue框架的uniapp小程序开发发现了新大陆

项目场景&#xff1a; 在基于vue框架的uniapp小程序开发中&#xff0c;在页面跳转时&#xff0c;当前页路径带参数&#xff0c;在跳转页中接受数据除了用官方推荐的保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用onLoad(option)接受数据&#xff0c;但是我发…

【动手学深度学习】课程笔记 04 数据操作和数据预处理

目录 数据操作 N维数组样例 访问元素 数据操作实现 入门 运算符 广播机制 节省内存 转换为其他Python对象 数据预处理实现 数据操作 N维数组是机器学习和神经网路的主要数据结构。 N维数组样例 访问元素 数据操作实现 下面介绍一下本课程中需要用到的PyTorch相关操…

【jvm--堆】

文章目录 1. 堆&#xff08;Heap&#xff09;的核心概述2. 图解对象分配过程2.1 Minor GC&#xff0c;MajorGC、Full GC 1. 堆&#xff08;Heap&#xff09;的核心概述 堆针对一个 JVM 进程来说是唯一的&#xff0c;也就是一个进程只有一个 JVM&#xff0c;但是进程包含多个线程…

Leetcode hot 100之回溯O(N!):选择/DFS

目录 框架&#xff1a;排列/组合/子集 元素无重不可复选 全排列 子集 组合&#xff1a;[1, n] 中的 k 个数 分割成回文串 元素无重不可复选&#xff1a;排序&#xff0c;多条值相同的只遍历第一条 子集/组合 先进行排序&#xff0c;让相同的元素靠在一起&#xff0c;如…

玩重生奇迹MU如何搭配武器装备

在游戏里面怎么搭配装备呢&#xff0c;玩家是否在思考这个问题呢&#xff0c;肯定要不断的了解所玩的职业&#xff0c;必须要懂得掌握不一样的装备搭配方法&#xff0c;这样才可以更好的发挥所玩职业最强大的伤害输出。 一、武器装备搭配技巧 在游戏中需要懂得搭配装备的技巧…