常见排序算法之堆排序

news2024/9/23 9:23:25

       堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。       

       需要注意的是排升序要建大堆,排降序建小堆。

       堆排序的基本思想是:将待排序的序列构造成一个大顶堆(或小顶堆),然后将堆顶元素与最后一个元素交换,然后对剩下的元素重新调整为大顶堆(或小顶堆),如此反复进行,直到序列完全有序。如下图所示:


具体代码实现如下:

void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])
		{
			++child;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

       首先定义了一个AdjustDown函数,用于调整堆中的元素位置。该函数接受一个整数数组a、数组长度n和父节点索引parent作为参数。在函数内部,首先计算左子节点的索引child,然后通过循环不断比较当前节点与左右子节点的大小,如果当前节点小于子节点,则交换它们的位置,并更新父节点索引和子节点索引,继续向下调整。


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;
	}
}

       接下来定义了HeapSort函数,用于对整个数组进行堆排序。该函数接受一个整数数组a和数组长度n作为参数。在函数内部,首先通过循环调用AdjustDown函数将整个数组构建成一个大顶堆,然后从最后一个元素开始,将其与堆顶元素交换,并调用AdjustDown函数调整剩余元素的位置,直到所有元素都被排序。


void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

       这段代码用于打印一个整数数组。它接受两个参数:一个指向整数数组的指针a和一个整数n,表示数组的长度。函数内部使用了一个循环来遍历数组中的每个元素。在每次迭代中,它将当前元素的值通过printf函数打印出来,并在每个元素之间添加一个空格。最后,在循环结束后,它再次调用printf函数打印一个换行符,以便在输出中分隔不同的数组元素。


void TestHeapSort()
{
	int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 };
	HeapSort(a, sizeof(a) / sizeof(int));
	PrintArray(a, sizeof(a) / sizeof(int));
}

       这段代码是一个测试函数,用于测试堆排序算法。它首先定义了一个整数数组a,然后调用HeapSort函数对数组进行堆排序,最后调用PrintArray函数打印排序后的数组。


整体实现结果如下:


特性总结:
        1. 堆排序使用堆来选数,效率较高。
        2. 时间复杂度: O(N*logN)
        3. 空间复杂度: O(1)
        4. 稳定性:不稳定

结语:堆排序的分享到这里就结束了,希望对大家的学习会有帮助,如果大家有什么问题或者不同的见解,欢迎大家的留言~~~

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

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

相关文章

虚拟机克隆

linux系统的组成&#xff1b; 主根目录和根目录; 所有的根目录都包含在主根目录中&#xff1b; 根目录&#xff1a; /root /home/xxx,yyy,zzz;主根目录&#xff1b;/ 一个重要的子目录&#xff1a;etc passwd, 保存了所有的三类用户信息&#xff1b;bashrc, 可以设置别名 及…

kafka基本原理详解

Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;&#xff0c;基于zookeeper协 调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&am…

模块化时代的必备工具:Webpack详解,为你的项目注入新活力

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

好书分享 | 千万富翁是怎么炼成的?

这是好书分享系列的第1篇&#xff0c;如果觉得对你有帮助&#xff0c;欢迎分享给你的朋友或家人。如果想继续收到本系列推文&#xff0c;请点击下方公众号关注我。 最近在微信读书的新书榜里&#xff0c;看到一本之前在国外网站看到别人推荐的书&#xff0c;《邻家的百万富翁》…

软件开发分享:从瀑布模式到水母模式——ChatGPT如何赋能软件研发全流程

文章目录 &#x1f4cb;前言&#x1f3af;ChatGPT如何赋能软件研发全流程&#x1f3af;ChatGPT和软件开发如何相辅相成&#x1f525;文末送书&#x1f9e9;专家推荐&#x1f9e9;内容介绍&#x1f9e9;作者介绍——陈斌 &#x1f525;参与方式 &#x1f4cb;前言 计算机技术的…

阿里云推出通义千问App,提供全方位的协助

&#x1f989; AI新闻 &#x1f680; 阿里云推出通义千问App&#xff0c;提供全方位的协助 摘要&#xff1a;阿里云旗下大模型通义千问App登陆各大安卓应用市场&#xff0c;具有超大规模预训练模型&#xff0c;可在创意文案、办公助理、学习助手、趣味生活等方面协助用户。功…

asp.net平面设计运营管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

asp.net平面设计运营管理系统 1.绪论 1.1编写的目的 3DA平面设计运营管理系统是为了提供本司经营模式拥有一个更便易管理职员工作的系统。目标是让职员工作更信息化&#xff0c;明确化&#xff1b;方便本司管理员能一站式解决工作中产生的数据进行统一汇总&#xff0c;提升管理…

镭神16线激光雷达跑SC-LeGo-LOAM算法

link 一、运行环境 环境&#xff1a;ubutu18.04ros:melodicpcl:1.8gtsammetis 环境配置&#xff1a; Eigen 3.3.4PCL 1.8.1 &#xff08;1.11不能用&#xff09;ceres 2.0.0gtsam 4.0.0 雷达参数&#xff1a; 二、下载编译运行 已修改配置的源码文件&#xff0c;下载catkin_ma…

【idea】生成banner.txt

Spring Boot banner在线生成工具&#xff0c;制作下载英文banner.txt&#xff0c;修改替换banner.txt文字实现自定义&#xff0c;个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner&#xff0c;轻松修改替换实现自定义banner&#xff0c;让banner.txt文…

谈API接入必须了解的各大API调用电商API应用场景

哪些业务场景可以使用API接口&#xff1f; &#xff08;1&#xff09;爬虫业务&#xff1a;在爬虫业务中&#xff0c;使用API接口可以帮助解决IP限制、反爬虫策略等问题&#xff0c;提高爬取数据的效率和稳定性。 &#xff08;2&#xff09;网络安全&#xff1a;在网络安全领…

CB2-2CARD的openSUSE远程SSH登录提示优化

CB2-2CARD的openSUSE远程SSH登录提示优化 1. 源由2. 优化内容2.1 去掉Password/banner前后的prompts提示语句2.2 增加logo登录界面2.3 增加系统运行情况简单汇报2.4 增加banner 3. 优化效果 1. 源由 之前运行的CB2-2CARD的openSUSE安装&NAS环境配置服务器已经运行也有段时…

POI实现省市级联(二级下拉框)

POI实现省市级联&#xff08;二级下拉框&#xff09; POI级联下拉框 直接上代码测试结果参考文章 POI级联下拉框 业务上经常会用到POI做Excel的导出&#xff0c;有时导出需求比较复杂&#xff0c;这里记录一下自己参考网上大神的水月境的博文完成的一个导出Excel省市级连下拉…

语雀故障与反思,顺便再领半年会员!

23 日语雀的故障相信大部分人都已经知道了&#xff0c;官方发布的公告是这样的&#xff1a; 10 月 23 日语雀出现重大服务故障&#xff0c;且持续 7 个多小时才完全恢复&#xff0c;给用户使用造成极大不便&#xff0c;对此我们深感抱歉。经过复盘&#xff0c;我们在这里向大家…

电脑数据文件恢复工具easyrecovery14中文版

当不小心将回收站的文件删除了怎么办&#xff1f;想找回但是不知道怎么找回需要的数据文件&#xff1f;别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具&#xff0c;easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&#xff0c;这款软件功能…

一道简单的C#面试题

试题&#xff1a; 抽顺序问题&#xff1a;有10位面试者&#xff0c;需要随机抽号面试。 1&#xff09;总共十个号数&#xff0c;用数组表示&#xff1b; 2&#xff09;每一位面试者输入1开始抽签&#xff0c;然后得到抽签号&#xff0c;输入2结束抽签&#xff1b; 3&#x…

(4) OpenCV图像处理SVM算法

一、介绍 考虑下面的图像,它具有两种数据类型,红色和蓝色。我们找到一条线f(x)=ax1+bx2+cf(x)=ax1+bx2+c,它将两条数据都分为两个区域。当我们得到一个新的test_data XX时,只需将其替换为f(x)f(x)即可。如果f(X)>0f(X)>0,则属于蓝色组,否则属于红色组。我们可以将此…

【QML】QML使用C++自定义组件,动态链接库DLL构建及使用

1. 方法1 &#xff08;C源码&#xff09; 1.1 创建一个普通的qml工程&#xff0c;写入ListView测试代码 import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 500visible: truetitle: qsTr("Hello World")ListView{id:lvwidth: 100height: 5…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示&#xff0c;RAG为LLM提供了有用的上下文&#xff0c;以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

第65讲:MySQL存储过程之循环语法的核心概念与应用案例

文章目录 1.存储过程中循环的种类2.WHILE循环控制2.1.WHILE循环语法格式2.2.WHILE循环经典案例 3.REPEAT循环控制3.1.REPEAT循环语法结构3.2.REPEAT循环经典案例 4.LOOP循环控制4.1.LOOP循环语法结构4.2.LOOP循环经典案例一4.3.LOOP循环经典案例二 1.存储过程中循环的种类 在存…

git 撤销已经push到远程的提交

git 撤销已经push到远程的提交 1. 情景2. 解决方法2.1 git revert2.2 git reset 1. 情景 工作中会有很多时候提交git的时候会提交错东西&#xff0c;而且已经push到远程的话怎么办呢&#xff1f; 2. 解决方法 2.1 git revert 一种常见的方法是使用 git revert 命令来创建一…