【算法】堆排序

news/2024/12/23 2:45:49/

1. 堆排序简介

堆排序heapsort)是由 J. W. J. Williams 于 1964 年发明的。是一种基于比较的排序算法,和选择排序一样,堆排序将数据序列分为已排序区域未排序区域两部分。通过从未排列区域中获取最大元素并将其插入已排序区域,迭代这个操作来缩小未排序区域。与选择排序不同的是,堆排序不会对未排序区域进行线性扫描,而是通过维护堆中未排序区域的数据结构以到达高效获取最大元素的目的。堆排序的平均时间复杂度为 O ( n log ⁡ n ) O{\left(n\log n\right)} O(nlogn),空间复杂度为 O ( 1 ) O{\left(1\right)} O(1)(原地算法)。

2. 原理

将数组转化为最大堆Max-Heap),根结点的键值是所有堆结点键值中最大者的二叉树。
Array [ p a r e n t ( i ) ] ≥ Array [ i ] {\text{Array}}{\left[parent{\left(i\right)} \right]}\ge{\text{Array}}{\left[i\right]} Array[parent(i)]Array[i]
接着重复取出最大堆中的最大值(即根节点值)插入已排序区域,并维护残余堆的最大堆特性就可完成排序。

3. 步骤

  1. 建立最大堆
  2. 取出最大值(即根节点),并维护残余堆。
  3. 递归步骤2,完成排序
Yes
No
开始
建立最大堆
获取根值?
维护残余堆
结束

3.1 数组索引和堆节点位置的关系

数组如下:

012345678
2634438547153626

可以看成

[0]=26
[1]=3
[2]=44
[3]=38
[4]=5
[5]=47
[6]=15
[7]=36
[8]=26

由此上可以看出:

  1. 数组 [ i ] {\left[i\right]} [i]的左子节点的位置为 2 × i + 1 2\times i+1 2×i+1
  2. 数组 [ i ] {\left[i\right]} [i]的右子节点的位置为 2 × i + 2 2\times i+2 2×i+2
  3. 数组 [ i ] {\left[i\right]} [i]的父节点的位置为
    • i i i为偶数则父节点位置为 i − 2 2 \frac{i-2}{2} 2i2
    • i i i为基数则父节点位置为 i − 1 2 \frac{i-1}{2} 2i1
    • 可以简化为数组 [ i ] {\left[i\right]} [i]的父节点位置为 ⌊ i − 1 2 ⌋ \lfloor \frac{i-1}{2}\rfloor 2i1

3.2 建立最大堆

从数组后面向前扫描并调整堆满足最大堆的特性:

[0]=26
[1]=3
[2]=44
[3]=38
[4]=5
[5]=47
[6]=15
[7]=36
[8]=26

数组中[7]=36 和 [8]=26 都满足小于父节点 [3]=38;继续向前扫描得 [6]=15 也满足小于父节点 [2]=44;继续:


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

相关文章

【算法每日一练]

目录 今日知识点: 辗转相减法化下三角求行列式 组合数动态规划打表 约数个数等于质因数的次方1的乘积 求一个模数 将n个不同的球放入r个不同的盒子:f[i][j]f[i-1][j-1]f[i-1][j]*j 将n个不同的球放入r个相同的盒子:a[i][j]a[i-j][j]a[…

计算机网络(特南鲍姆版) 期末总结

教材《计算机网络(第六版)》 特南鲍姆版 介绍 互联的可以交换信息的计算机称之为计算机网络,如:英特网 用途 1.访问信息 客户-服务器模型 peer-to-peer system(点对点技术,P2P) P2P&#xf…

那些王道书里的题目-----计算机网络篇

注:仅记录个人认为有启发的题目 p155 34.下列四个地址块中,与地址块 172.16.166.192/26 不重叠,且与172.16.166.192/26聚合后的地址块不会引入多余地址的是() A.172.16.166.192/27 B.172.16.166.128/26 …

Python爬虫之正则表达式与httpx的使用与案例

三、正则表达式 1、实例 模式描述\w匹配字母、数字以及下划线\W匹配不是字母、数字以及下划线\s匹配任意空白字符,等价于[\t\n\r\f]\S匹配任意非空字符\d匹配任意数字,等价于[0-9]\D匹配任意非数字的字符\A匹配字符串开头\Z匹配字符串结尾。如果存在换…

【Linux】详细分析/dev/loop的基本知识 | 空间满了的解决方法

目录 前言1. 基本知识2. 内存满了2.1 清空2.2 扩增 3. 彩蛋 前言 服务器一直down机,翻找日志文件一直找不到缘由,最终发现是挂载的内存满了,那本身这个文件就什么用呢? 1. 基本知识 /dev/loop是一种特殊的设备文件,…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

力扣3. 无重复字符的最长子串

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.川建一个set集合存储最长的无重复的字符; 2.创建双指针p、q,每次当q指针指向的字符不在set集合中时将其添加到set集合中让q指针后移,并且更新…

网络编程中的序列化、反序列化与协议

网络编程中的序列化、反序列化与协议 1. 序列化和反序列化的概念2. 序列化、反序列化与协议的关系3. JSON与网络通信 在网络编程中,序列化和反序列化与协议密切相关,它们共同构成了数据在网络中传输的基础。本文将详细介绍序列化、反序列化以及它们与协议…