This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions
+4 -4
View File
@@ -2,7 +2,7 @@
comments: true
---
# 11.6.   归并排序
# 11.6   归并排序
「归并排序 Merge Sort」基于分治思想实现排序,包含“划分”和“合并”两个阶段:
@@ -13,7 +13,7 @@ comments: true
<p align="center"> 图:归并排序的划分与合并阶段 </p>
## 11.6.1. &nbsp; 算法流程
## 11.6.1 &nbsp; 算法流程
“划分阶段”从顶至底递归地将数组从中点切为两个子数组:
@@ -625,13 +625,13 @@ comments: true
- **在阅读代码时,需要特别注意各个变量的含义**。`nums` 的待合并区间为 `[left, right]` ,但由于 `tmp` 仅复制了 `nums` 该区间的元素,因此 `tmp` 对应区间为 `[0, right - left]` 。
- 在比较 `tmp[i]` 和 `tmp[j]` 的大小时,**还需考虑子数组遍历完成后的索引越界问题**,即 `i > leftEnd` 和 `j > rightEnd` 的情况。索引越界的优先级是最高的,如果左子数组已经被合并完了,那么不需要继续比较,直接合并右子数组元素即可。
## 11.6.2. &nbsp; 算法特性
## 11.6.2 &nbsp; 算法特性
- **时间复杂度 $O(n \log n)$ 、非自适应排序** :划分产生高度为 $\log n$ 的递归树,每层合并的总操作数量为 $n$ ,因此总体时间复杂度为 $O(n \log n)$ 。
- **空间复杂度 $O(n)$ 、非原地排序** :递归深度为 $\log n$ ,使用 $O(\log n)$ 大小的栈帧空间。合并操作需要借助辅助数组实现,使用 $O(n)$ 大小的额外空间。
- **稳定排序**:在合并过程中,相等元素的次序保持不变。
## 11.6.3. &nbsp; 链表排序 *
## 11.6.3 &nbsp; 链表排序 *
归并排序在排序链表时具有显著优势,空间复杂度可以优化至 $O(1)$ ,原因如下: