This commit is contained in:
krahets
2023-08-21 19:32:37 +08:00
parent 02ac0aa9fe
commit fb9ace3a95
62 changed files with 291 additions and 254 deletions

View File

@@ -17,14 +17,16 @@ comments: true
## 11.7.1   算法流程
设数组的长度为 $n$ ,堆排序的流程如下
设数组的长度为 $n$ ,堆排序的流程如下图所示。
1. 输入数组并建立大顶堆。完成后,最大元素位于堆顶。
2. 将堆顶元素(第一个元素)与堆底元素(最后一个元素)交换。完成交换后,堆的长度减 $1$ ,已排序元素数量加 $1$ 。
3. 从堆顶元素开始从顶到底执行堆化操作Sift Down。完成堆化后堆的性质得到修复。
4. 循环执行第 `2.``3.` 步。循环 $n - 1$ 轮后,即可完成数组排序。
实际上,元素出堆操作中也包含第 `2.``3.` 步,只是多了一个弹出元素的步骤。
!!! tip
实际上,元素出堆操作中也包含第 `2.``3.` 步,只是多了一个弹出元素的步骤。
=== "<1>"
![堆排序步骤](heap_sort.assets/heap_sort_step1.png)
@@ -64,7 +66,7 @@ comments: true
<p align="center"> 图:堆排序步骤 </p>
在代码实现中,我们使用了与堆章节相同的从顶至底堆化Sift Down)的函数。值得注意的是,由于堆的长度会随着提取最大元素而减小,因此我们需要给 Sift Down 函数添加一个长度参数 $n$ ,用于指定堆的当前有效长度。
在代码实现中,我们使用了与堆章节相同的从顶至底堆化 `sift_down()` 函数。值得注意的是,由于堆的长度会随着提取最大元素而减小,因此我们需要给 `sift_down()` 函数添加一个长度参数 $n$ ,用于指定堆的当前有效长度。
=== "Java"