|
|
|
@ -7,10 +7,13 @@
|
|
|
|
|
「堆排序 Heap Sort」是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序:
|
|
|
|
|
|
|
|
|
|
1. 输入数组并建立小顶堆,此时最小元素位于堆顶。
|
|
|
|
|
2. 初始化一个数组 `res` ,用于存储排序结果。
|
|
|
|
|
3. 循环执行 $n$ 轮出堆操作,并依次将出堆元素记录至 `res` ,即可得到从小到大排序的序列。
|
|
|
|
|
2. 不断执行出堆操作,依次记录出堆元素,即可得到从小到大排序的序列。
|
|
|
|
|
|
|
|
|
|
该方法虽然可行,但需要借助一个额外数组,比较浪费空间。在实际中,我们通常使用一种更加优雅的实现方式。设数组的长度为 $n$ ,堆排序的流程如下:
|
|
|
|
|
以上方法虽然可行,但需要借助一个额外数组来保存弹出的元素,比较浪费空间。在实际中,我们通常使用一种更加优雅的实现方式。
|
|
|
|
|
|
|
|
|
|
## 算法流程
|
|
|
|
|
|
|
|
|
|
设数组的长度为 $n$ ,堆排序的流程如下:
|
|
|
|
|
|
|
|
|
|
1. 输入数组并建立大顶堆。完成后,最大元素位于堆顶。
|
|
|
|
|
2. 将堆顶元素(第一个元素)与堆底元素(最后一个元素)交换。完成交换后,堆的长度减 $1$ ,已排序元素数量加 $1$ 。
|
|
|
|
@ -139,6 +142,6 @@
|
|
|
|
|
|
|
|
|
|
## 算法特性
|
|
|
|
|
|
|
|
|
|
- **时间复杂度 $O(n \log n)$ 、非自适应排序** :从堆中提取最大元素的时间复杂度为 $O(\log n)$ ,共循环 $n - 1$ 轮。
|
|
|
|
|
- **时间复杂度 $O(n \log n)$ 、非自适应排序** :建堆操作使用 $O(n)$ 时间。从堆中提取最大元素的时间复杂度为 $O(\log n)$ ,共循环 $n - 1$ 轮。
|
|
|
|
|
- **空间复杂度 $O(1)$ 、原地排序** :几个指针变量使用 $O(1)$ 空间。元素交换和堆化操作都是在原数组上进行的。
|
|
|
|
|
- **非稳定排序**:在交换堆顶元素和堆底元素时,相等元素的相对位置可能发生变化。
|
|
|
|
|