【数据结构】堆排序

news/2024/11/17 2:39:17/

文章目录

  • 前言
  • 堆排序的介绍
    • 1.1 堆排序是什么
    • 1.2 为什么使用堆排序
  • 二、建堆
    • 2.1 向上调整建堆 - O(n*log(n))
    • 2.2 向下调整建堆 - O(n)
  • 三、排序
  • 总结


前言

堆排序是一种非常高效的排序算法,它可以在O(n log n)的时间内对任意序列进行排序。它的原理是利用数据结构,堆的性质,将序列构建成一个大根堆或小根堆,然后不断地交换堆顶元素和最后一个元素,并调整堆的结构,直到堆为空。

如果你对数据结构,堆还不太熟悉,或者你想复习一下它的基本概念和操作,请先阅读我之前写的一篇文章【数据结构】堆,你可以在我的博客中找到它。如果你已经掌握了数据结构,堆的知识,那么请继续阅读这篇文章,我将为你详细地介绍算法,堆排序的过程和代码实现。如果你觉得这篇文章对你有帮助,或者你想了解更多关于数据结构和算法的知识,请给我点赞👍,并关注我的博客。我会不定期地分享更多有趣和实用的内容。谢谢你的阅读和支持!


堆排序的介绍

1.1 堆排序是什么

堆排序指的是将一组数据看成堆,再对其进行排序。
分为两个过程

  1. 建堆:将数据排成大根堆或小根堆,用于找最大/最小
  2. 排序:将数据排成升序或降序

其中它们涉及核心函数为

  • 向上调整函数AdjustUp()
  • 向下调整函数AdjustDown()

1.2 为什么使用堆排序

因为时间复杂度小。
建堆的时间复杂度最小为O(n)
排序的时间复杂度最小为O(n*long(n)) 这比之前学习的冒泡排序要更好


下面,我将为你介绍如何设计堆排序,以及如何计算它的时间复杂度。

二、建堆

建堆分为2种,向上调整建堆向下调整建堆,其中向下调整建堆的时间复杂度更优,向上调整建堆更容易理解。

建堆可以用来找最大/最小值。现在给一个一维数组a,共十个元素,均为int类型,无序。
在这里插入图片描述

2.1 向上调整建堆 - O(n*log(n))

向上调整建堆的核心:将a[0]之后的数据看成一次次插入进去。
在这里插入图片描述

这里建的是大堆
在这里插入图片描述
在这里插入图片描述


2.2 向下调整建堆 - O(n)

向下调整建堆:我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


因为向下调整建堆的时间复杂度更小,所有一般采用向下调整建堆。

void HeapSort(int* a, int sz) {//建堆//向上调整建堆/*for (int i = 1; i < sz; i++) {AdjustUp(a, i);}*///向下调整建堆for (int i = (sz - 1 - 1) / 2; i >= 0; i--) {AdjustDown(a, sz, i);}
}

通过建堆便可以找出最大或最小值,但如果要进行拍成升序或降序则下面的排序算法。


三、排序

现在我已经建好堆了,那该如何把数组a排成升序呢?

void HeapSort(int* a, int sz) {//向下调整建堆for (int i = (sz - 1 - 1) / 2; i >= 0; i--) {AdjustDown(a, sz, i);}//排序for (int j = 0; j < sz-1; j++) {Swap(&a[0], &a[sz - 1 - j]);AdjustDown(a, sz-j-1, 0);}
}

思想和堆的删除一样

  • 先将堆顶元素与尾元素换位
  • 再对首元素进行向下调整

注意:AdjustDown的第二个参数size.
在这里插入图片描述


总结

总之,堆排序是一个非常高效、稳定的排序算法,它在处理大规模数据时表现尤为出色。如果你能够理解并掌握它的实现原理,相信你在以后的程序开发中一定能事半功倍。希望这篇文章能够帮助到你,并且让你对堆排序有更深入的了解。如果你觉得这篇文章有帮助,不妨点个赞支持一下哦。谢谢大家的阅读!
在这里插入图片描述


http://www.ppmy.cn/news/35671.html

相关文章

板内盘中孔设计狂飙,细密间距线路中招

一博高速先生成员&#xff1a;王辉东大风起兮云飞扬&#xff0c;投板兮人心舒畅。赵理工打了哈欠&#xff0c;伸了个懒腰&#xff0c;看了看窗外&#xff0c;对林如烟说道&#xff1a;“春天虽美&#xff0c;但是容易让人沉醉。如烟&#xff0c;快女神节了&#xff0c;要不今晚…

【教程】git多帐号配置 三步完成配置

【教程】git多帐号配置 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮…

【MySQL】MySQL的介绍MySQL数据库及MySQL表的基本操作

文章目录数据库的介绍什么是数据库数据库分类MySQL的介绍数据库的基本操作数据库的操作创建数据库查看所有数据库选中指定的数据库删除数据库常用数据类型数值类型字符串类型日期类型表的操作创建表查看指定数据库下的所有表查看指定表的结构删除表小练习数据库的介绍 什么是数…

前端布局小案例,分享3个漂亮的卡片组件

当今互联网发展迅猛&#xff0c;各种应用、网站和软件层出不穷&#xff0c;其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高&#xff0c;漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件&#xff0c;帮助您在前端开发中轻松…

【备战蓝桥杯】----01背包问题(动态规划)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

【Linux】计算机网络1

计算机网络的背景背景&#xff1a;早在20世纪50年代初&#xff0c;美国建立的地面防空系统就是将地面的雷达和其他测量控制设备的信息通过通信线路汇集到一台中心计算机进行处理&#xff0c;开创了把计算机技术和通信技术相结合的尝试。20世纪60年代中期开始&#xff0c;出现、…

[致敬未来的攻城狮计划 1] 使用 “FSP Configuration”(FSP 配置)透视配置器设置运行环境

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;瑞萨电子 (Renesas Electronics Corporation) &#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 4 天&#xff0c;点击…

详解:数字化企业转型,如何做好知识文档管理?

随着数字化时代的到来&#xff0c;企业也面临着数字化转型的问题。知识文档的管理是数字化企业转型中非常重要的一环。本文将详细介绍数字化企业如何做好知识文档管理。 一、什么是知识文档管理&#xff1f; 知识文档管理是指对企业所拥有的知识文档进行有效地收集、分类、存…