[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆?           

        堆是一种图的树形结构,被用于实现“优先队列”(priority queues)

注:优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺序取出。

        在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中,堆中的每个结点最多有两个子结点

        在堆中存储数据时必须遵守这样一条规则:子结点必定大于父结点。因此,最小值被存储在顶端的根结点中。从堆中取出数据时,取出的是最上面的数据。这样,堆中就能始终保持最上面的数据最小。同时由于最上面的数据被取出,因此堆的结构也需要重新调整。


01 首先,在堆中存储所有的数据,并按降序来构建堆。


02 现在,所有数据都存进堆里了。为了排序,需要再从堆中把数据一个个取出来。

注:
从降序排列的堆中取出数据时会从最大的数据开始取,所以将取出的数据反序输出,排序就完成了。


03 首先取出根结点的数字7。


04 重新构造堆。

重构的规则请参考:

[数据结构]图解堆结构及其代码实现-CSDN博客

05 同样地,取出根结点的数字6,将它放在右数第2个位置上。


06 重新构造堆。


07 重复上述操作直到堆变空为止。


08 排序中……


09 从堆中取出了所有数字,排序完成。

解说
        堆排序一开始需要将n个数据存进堆里,所需时间为O(nlogn)。排序过程中,堆从空堆的状态开始,逐渐被数据填满。由于堆的高度小于log2n,所以插入1个数据所需要的时间为O(logn)。
每轮取出最大的数据并重构堆所需要的时间为O(logn)。由于总共有n轮,所以重构后排序的时间也是O(nlogn)。因此,整体来看堆排序的时间复杂度为O(nlogn)。
        这样来看,堆排序的运行时间比之前讲到的冒泡排序、选择排序、插入排序的时间O(n2)都要短,但由于要使用堆这个相对复杂的数据结构,所以实现起来也较为困难。
        一般来说,需要排序的数据都存储在数组中。这次我们使用了堆这种数据结构,但实际上,这也相当于将堆嵌入到包含了序列的数组中,然后在数组中通过交换数据来进行排序。具体来说,就是让堆中的各结点和数组像下图这样呈对应关系。正如大家所见,这可以说是强行在数组中使用了堆结构。

 

代码演示

def heapify(arr, n, i):
    # 初始化最大值的索引为当前节点
    largest = i
    # 左子节点的索引
    left = 2 * i + 1
    # 右子节点的索引
    right = 2 * i + 2

    # 如果左子节点比当前节点大,更新最大值索引
    if left < n and arr[i] < arr[left]:
        largest = left

    # 如果右子节点比当前节点大,更新最大值索引
    if right < n and arr[largest] < arr[right]:
        largest = right

    # 如果最大值不是当前节点,交换值并递归调整
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)


def heap_sort(arr):
    n = len(arr)

    # 构建最大堆(Max Heap)
    # 从最后一个非叶子节点开始到根节点,逐个进行堆调整
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 逐步取出最大元素并进行堆调整
    for i in range(n - 1, 0, -1):
        # 将当前最大值(堆顶)与未排序部分的最后一个值交换
        arr[i], arr[0] = arr[0], arr[i]
        # 对剩余元素重新构建最大堆
        heapify(arr, i, 0)

    return arr


arr = [2, 6, 7,8, 9, 4, 10, 3, 5, 1]
sorted_arr = heap_sort(arr)
print(sorted_arr)
结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

更详细的可以看这篇文章:

[数据结构]图解堆结构及其代码实现-CSDN博客


文章来源:书籍《我的第一本算法书》

书籍链接:

我的第一本算法书 (豆瓣) (douban.com)

作者:宫崎修一 石田保辉

出版社:人民邮电出版社

ISBN:9787115495242

本篇文章仅用于学习和研究目的,不会用于任何商业用途。引用书籍《我的第一本算法书》的内容旨在分享知识和启发思考,尊重原著作者宫崎修一和石田保辉的知识产权。如有侵权或者版权纠纷,请及时联系作者。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/jhghuhbb/article/details/139089141

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

书籍学习|基于SprinBoot+vue的书籍学习平台(源码+数据库+文档)

书籍学习平台 目录 基于SprinBootvue的书籍学习平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 5.2.3作者功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

mysql数据导入navicat中,报错提示1067

MySQL导入问题&#xff1a; 报错1067 - Invalid default value for 字段名 由于数据库版本升级&#xff0c;老数据库的数据文件导出以后&#xff0c;在新版本的数据库上执行会报错 这种问题多是由于默认值不兼容引起的&#xff0c;我们可以通过修改sql_mode来解决这个问题 由…

Steamdeck使用Windows系统游玩雪地奔驰时闪退问题解决方法

我非常喜欢雪地奔驰这款游戏&#xff0c;买sd的一部分也是为了它。可在我打开这个游戏时&#xff0c;游戏发生闪退问题。查阅了网络各个途径&#xff0c;基本没有解决方法。因此我自己分析终于解决该问题。以下是我解决问题的思路&#xff0c;仅供记录参考&#xff1a; 游戏在崩…

关于TeamSpeak3-网易音乐机器人的基础使用方法(胎教级教程)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;在自己的ts服务器上安装了网易音乐机器人&#xff0c;写这篇文章旨在教群友/网友如何使用机器人!&#x1f60b;&#x1f44d; 一、TS3Audi…

FM1800隧道广播插播控制器

隧道广播插播控制器是一款群载波&应急广播插播控制器采用SDR软件无线电技术&#xff0c;产生独立的插播信号与“群载波”信号&#xff0c;本设备可通过软件无线电技术将音频信号调制成调频载波或“群载波”信号&#xff0c;分别送入插播主机&#xff0c;实现隧道广播远端机…

服务器上创建搭建gitlab

一、下载与安装 在主目录操作~ 1.使用wget下载 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.0.1-ce.0.el7.x86_64.rpm 可以在开源软件镜像站选择合适的版本&#xff0c;版本不同页面菜单会稍有差异&#xff0c;此次选…

[自动驾驶技术]-5 Tesla自动驾驶方案之算法(AI Day 2021)

有朋友问我&#xff0c;如何有效学习一个新技术。笔者这么多年的经验是&#xff1a;1&#xff09;了解国内外产业应用和标准法规现状&#xff0c;先建立宏观知识图谱及技术系统框架&#xff1b;2&#xff09;根据系统框架逐块进行深入研究&#xff08;横向、纵向&#xff09;&a…

聚观早报 | 小米14 Civi官宣;小度推出学习机Z30

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月29日消息 小米14 Civi官宣 小度推出学习机Z30 vivo S19电池细节 360软件管家全面升级 荣耀200 Pro影像细节 …

c++11特性(详细)

文章目录 前言一、C11介绍二、列表初始化1.{}初始化2.initializer_list 三、auto与decltype四、STL中变化五、右值引用六.C中关于类的新功能七.可变参数模板八.lambda表达式总结 前言 在本篇文章&#xff0c;我们将会详细介绍一下C11新增的一些特性&#xff0c;其中最重要的是…

强国机械制造有限公司开展中国制造2050系列高端论坛

为深入探讨中国制造2050战略的实施路径和未来发展方向,强国机械制造有限公司2023年10月13日举办了一系列高端论坛。这些论坛吸引了众多业内专家、学者和企业代表参加,共同交流前沿观点和经验,以推动中国制造业的创新与发展。 本次系列高端论坛涵盖了多个关键主题,以下是各论坛…

数据结构---单向链表

思路分析&#xff1a; 1. 设计 struct LinkNode 节点结构体 strut LList 链表结构体 typedef void *LinkList 给用户使用链表指针 2. 初始化链表 LinkList mylist init_LinkList(); 3. 插入链表 void inser…

【最优化方法】实验三 无约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生进一步熟悉掌握使用MATLAB软件&#xff0c;并能利用该软件进行无约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、最速下降法的MATLAB实现 &#xff12;、牛顿法的MATLAB实现 &#xff13;、共轭梯度法的MATLAB…

PostgreSQL 小课推广-20240529

目前 PostgreSQL 小课在持续更新中&#xff0c; PostgreSQL 小课专栏 新人优惠券到 2024 年 6 月 1 日到期&#xff0c;有需要的伙伴还请关注下&#xff1a; 目前专栏的 50 元/年&#xff0c;后续到期不需要续费&#xff0c;等到专栏完成&#xff0c;会有一个价格调整&#xff…

618入手不亏的好物有哪些?五款品质兼优的好物分享!

随着618购物狂欢节的到来&#xff0c;各位消费者们是否已经摩拳擦掌&#xff0c;准备开启一场购物盛宴&#xff1f;在这里&#xff0c;我们为您精心准备了一份不容错过的购物清单&#xff0c;无论您是科技迷、学生还是家居生活爱好者&#xff0c;都能找到心仪的好物。 1、学生…

在全志H616核桃派开发板上进行音频配置的方法详解

耳机口​ 核桃派板载的3.5mm音频输出口&#xff0c;该接口有一定的输出功率&#xff0c;可以使用耳机或者带功放的扬声器都可以播放声音。 查看音频设备​ 可以使用下面指令来查看音频信息&#xff1a; aplay -l音频播放测试​ 播放系统自带wav音频文件测试, 下面指令的au…

MyBatisPlus的简单入门

文章目录 1.MybatisPlus的简介2.创建SpringBoot工程3.编写测试类 1.MybatisPlus的简介 MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在&#xff1a;简化开发、提高效率。 它对应的官方网址&#xff1a;链接 2.创建Sprin…

yolo 算法 易主

标题&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 论文&#xff1a;https://arxiv.org/pdf/2405.14458ethttps%3A//arxiv.org/pdf/2405.14458.zhihu.com/?targethttps%3A//arxiv.org/pdf/2405.14458 源码&#xff1a;https://github.com/THU-MIG/yolov10 分析…

西储大学数据集学习

数据集下载地址&#xff1a;CWRU凯斯西储大学轴承数据数据集——附&#xff1a;下载链接_西储大学轴承数据集下载-CSDN博客 最近研究故障诊断&#xff0c;先对使用比较多的西储大学数据集研究。以资料【1】中的内容展开研究。 1、轴承的结构 轴承分为外圈、内圈、保持架和滚珠…

卧式混料机:混合设备的智慧之选

卧式混料机&#xff0c;顾名思义&#xff0c;是一种采用卧式结构的混合设备。它的设计精巧&#xff0c;结构紧凑&#xff0c;不仅占用空间小&#xff0c;而且操作简便&#xff0c;维护方便。与传统的立式混料机相比&#xff0c;卧式混料机在混合效率、混合均匀度以及物料适应性…