【算法之排序篇】 堆排序详解!(源码+图解)

这篇具有很好参考价值的文章主要介绍了【算法之排序篇】 堆排序详解!(源码+图解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法之排序篇】 堆排序详解!(源码+图解),# 排序篇,算法,数据结构,开发语言,c语言

🎥 屿小夏 : 个人主页
🔥个人专栏 : 算法—排序篇
🌄 莫道桑榆晚,为霞尚满天!

📑前言

什么是堆排序?堆在原数据结构上是怎么实现堆排从而使数据有序的?

🌤️堆的理论概念

☁️堆的思想

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

🌤️堆的代码具体实现

☁️图解

【算法之排序篇】 堆排序详解!(源码+图解),# 排序篇,算法,数据结构,开发语言,c语言

☁️源码

//堆排序
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;
	}
}
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--;
	}
}

☁️源码剖析

  1. AdjustDown 函数用于维护堆的性质,即父节点的值大于或等于其子节点的值。它从一个节点开始,将它与其子节点比较,并交换它和较大子节点的值,然后继续向下递归调整,直到满足堆的性质。
  2. HeapSort 函数首先通过遍历数组,从最后一个非叶子节点开始,调用 函数,逐步构建最大堆。AdjustDown
  3. 然后,将堆的根节点(最大值)与数组的最后一个元素交换,将最大值放到正确的位置。
  4. 接着,重新调用 函数,将剩余元素重新构建成最大堆,排除已排序的部分。AdjustDown
  5. 重复步骤 3 和 4,直到整个数组有序。

🌤️堆排序特性

☁️不稳定排序

堆排序是一种不稳定的排序算法,因为在堆的调整过程中可能会改变相同值的元素的相对顺序。

☁️时间复杂度

堆排序的平均和最坏时间复杂度均为 O(n*log(n)),其中 n 是待排序元素的数量。

☁️原地排序

堆排序是一种原地排序算法,不需要额外的辅助存储空间,只需要在原数组上进行元素的交换和调整。

☁️不适用于小数据集

堆排序的性能相对较好,但对于小规模的数据集来说,其常数项较大,不如快速排序等算法效率高。

☁️堆的构建和调整

堆排序的核心是构建堆(通常是最大堆),然后反复将堆顶元素(最大值)与堆中的最后一个元素交换,并调整堆,使剩余部分仍然满足堆的性质。

☁️适用于外部排序

堆排序也适用于外部排序问题,其中数据无法全部加载到内存中,需要逐块处理数据。

☁️稳定性

堆排序通常不是稳定的排序算法,即相同值的元素在排序后的相对位置可能会改变。如果需要稳定性排序,应该选择其他算法,如归并排序。

☁️最好、最坏和平均情况

堆排序的时间复杂度在任何情况下都是 O(n*log(n)),因此具有稳定的性能。

🌤️全篇总结

堆排序的主要优点在于它具有稳定的时间复杂度 O(n*log(n)),适用于大规模数据集的排序,而且是一种原地排序算法,不需要额外的空间。但它并不适用于小规模数据集,因为其常数项较大。堆排序也不是稳定排序,即相同值的元素在排序后的相对位置可能会改变。

☁️相信聪明的你肯定已经学会堆排了吧。

看到这里希望给博主留个:👍点赞🌟收藏⭐️关注!
你们的三连就是博主创作的最大动力!

【算法之排序篇】 堆排序详解!(源码+图解),# 排序篇,算法,数据结构,开发语言,c语言文章来源地址https://www.toymoban.com/news/detail-759101.html

到了这里,关于【算法之排序篇】 堆排序详解!(源码+图解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

    目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序👑 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1🥇 情况2🥈 交换类排序两个常见的排序算法【冒泡排序】、【快速排序】 交换排序基本思想:

    2024年02月16日
    浏览(41)
  • 【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    目录 1、归并排序  1.1、算法描述  1.2、图解说明 2、代码实现  3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用 递归 或者说是 分治法 (Divide and Conquer)的一个非

    2024年02月08日
    浏览(46)
  • 【数据结构】单双链表超详解!(图解+源码)

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 数据结构解析 🌄 莫道桑榆晚,为霞尚满天! 什么是链表?链表有着什么样的结构性?它是怎么实现的? 看完这篇文章,你对链表的理解将会上升新的高度! 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺

    2024年02月06日
    浏览(34)
  • 拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

    在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 如图所示。 对于一个有向图,若x点指向y点,则称x点为y点的入度。 对于一个有向图,若x点指向y点,则称y点为x点的出度。 队列是一种特殊的线性表,特殊之处在

    2024年02月07日
    浏览(37)
  • 【排序算法】数据结构排序详解

    前言: 今天我们将讲解我们数据结构初阶的最后一部分知识的学习,也是最为“炸裂”的知识---------排序算法的讲解!!!! 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,

    2023年04月08日
    浏览(37)
  • 【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现

    归并排序是一种经典的排序算法,它使用了分治法的思想。下面是归并排序的算法思想: 递归地将数组划分成较小的子数组,直到每个子数组的长度为1或者0。 将相邻的子数组合并,形成更大的已排序的数组,直到最终得到一个完全排序的数组。 归并排序的过程可以分为三

    2024年01月22日
    浏览(53)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(51)
  • 【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

     💯 博客内容:【茶话数据结构】查找最短路径——Dijkstra算法详解 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三

    2024年02月08日
    浏览(34)
  • 『初阶数据结构 • C语言』⑬ - 堆排序详解【附完整源码】

     = 目录 0.写在前面 1.什么是堆? 2. 堆排序 2.1 建堆 2.1.1 AdjustUp(向上调整算法) 2.1.2 AdjustDown(向下调整算法) 2.2 两种建堆算法的时间复杂度 2.2.1 AdjustUp建堆的时间复杂度 2.2.2 AdjustDown建堆的时间复杂度 2.3 排序 3.堆排序的时间复杂度 完整源码 你是否对堆排序早有耳闻?身

    2024年02月16日
    浏览(30)
  • 【排序算法】希尔排序详解!(源码+实现)

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是希尔排序?希尔排序是如何实现的?它的思想和由来又是什么? 本文将从多方面,精细的带你了解希尔排序,让你彻底掌握它! 希尔排序(Shell Sort)是一种排序算法,由美国计算机

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包