| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 堆排序(HeapSort) -> 正文阅读 |
|
[数据结构与算法]堆排序(HeapSort) |
1. 堆的概念堆的数据结构也即是个顺序存储的完全二叉树。在STL容器当中的实现为
p
r
i
o
r
i
t
y
_
q
u
e
u
e
priority\_queue
priority_queue,即优先队列。 其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。 2. 堆的实例举例来说,对于
n
n
n个元素的序列
n
u
m
s
0
,
n
u
m
s
1
,
.
.
.
,
n
u
m
s
n
{nums_0, nums_1, ... , nums_n}
nums0?,nums1?,...,numsn?当且仅当满足下列关系之一时,称之为堆: 如上图所示,序列
n
u
m
s
{
3
,
8
,
15
,
31
,
25
}
nums\{3, 8, 15, 31, 25\}
nums{3,8,15,31,25}是一个典型的小根堆。 可以看出,它们满足以下规律:
3. 堆排过程3.1 堆排思想堆排序基本思想:将待排序序列(元素数目为 n n n)构造为一个大/小顶堆,此时,整个序列的最大/小值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大/小值。然后将剩余 n ? 1 n-1 n?1 个元素重新构造成一个堆,这样会得到 n n n 个元素的次小值。如此反复执行,便可得到一有序序列了。 具体操作层面上为:
3.2 堆排过程示意以无序序列 { 1 , 3 , 4 , 5 , 2 , 6 , 9 , 7 , 8 , 0 } \{ 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 \} {1,3,4,5,2,6,9,7,8,0}的升序排序为例: (1) 构建初始大根堆: (2) 取出最大值放置到序列末尾,除开序列末尾将剩余元素重新调整为大根堆,重复该操作直至剩余元素的个数为1: 3.3 堆排代码实现代码实现,使用LeetCode中的 912. 排序数组 进行测试,这里所求的是升序序列,也即是大根堆实现对无序数组的排序,实现的代码如下:
4. 复杂度分析总体情况如下: 时间复杂度: 堆排序是一种选择排序,整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。 其中构建初始堆经推导复杂度为
O
(
n
)
O(n)
O(n),在交换并重建堆的过程中,需交换
n
?
1
n-1
n?1次,而重建堆的过程中,根据完全二叉树的性质,
[
l
o
g
2
(
n
?
1
)
,
l
o
g
2
(
n
?
2
)
.
.
.
1
]
[log_2(n-1),log_2(n-2)...1]
[log2?(n?1),log2?(n?2)...1]逐步递减,近似为
n
l
o
g
n
nlogn
nlogn。所以堆排序时间复杂度一般认为就是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)级。
算法稳定性: 堆排序是一种不稳定的排序方法。因为在堆的调整过程中,关键字进行比较和交换所走的是该结点到叶子结点的一条路径,因此对于相同的关键字就可能出现排在后面的关键字被交换到前面来的情况。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:31:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |