HB3-归并排序¶
代码实现¶
非递归实现(迭代版本)¶
算法执行过程图解¶
递归调用树图示¶
复杂度分析¶
时间复杂度:O(n log n)¶
详细分析:
- 分解阶段:
- 每次将数组分成两半
-
分解的深度为 log n 层
-
合并阶段:
- 每一层需要合并所有元素
- 每层合并操作的时间复杂度为 O(n)
-
共有 log n 层
-
总时间复杂度:
-
无论最好、最坏、平均情况:
- 时间复杂度都为 O(n log n)
- 这是归并排序的重要特性
空间复杂度:O(n)¶
详细分析:
- 递归调用栈:
- 递归深度为 log n
-
空间复杂度为 O(log n)
-
临时数组:
- 每次合并需要 O(n) 的临时空间
-
虽然可以复用,但在递归过程中需要额外空间
-
总体空间复杂度:O(n)
关键知识点延伸¶
1. 算法思想:分治法¶
归并排序是分治法的经典应用: - 分解(Divide):将问题分解为规模更小的子问题 - 解决(Conquer):递归地解决子问题 - 合并(Combine):将子问题的解合并为原问题的解
2. 稳定性分析¶
- 稳定排序:相等元素的相对位置不会改变
- 在合并过程中,当A[i] == A[j]时,优先选择左子数组的元素
- 因此相等元素的相对顺序得以保持
3. 与快速排序的比较¶
| 特性 | 归并排序 | 快速排序 |
|---|---|---|
| 时间复杂度 | O(n log n)稳定 | 平均O(n log n),最坏O(n²) |
| 空间复杂度 | O(n) | O(log n) |
| 稳定性 | 稳定 | 不稳定 |
| 实现难度 | 中等 | 简单 |
| 缓存性能 | 一般 | 较好 |
4. 优化策略¶
4.1 小数组优化¶
4.2 预分配临时数组¶
| C | |
|---|---|
5. 应用场景¶
- 外部排序:适合处理大量数据的排序
- 链表排序:归并排序特别适合链表结构
- 稳定性要求:需要保持相等元素相对顺序的场景
- 时间复杂度要求严格:需要保证O(n log n)时间复杂度
6. 链表归并排序¶
7. 多路归并¶
算法特点总结¶
- 时间复杂度稳定:无论什么情况都是O(n log n)
- 稳定排序:保持相等元素的相对位置
- 分治思想:典型的分治算法应用
- 适合大数据:可以很容易地改造成外部排序
- 可并行化:分解过程可以并行执行
记忆要点¶
- "分而治之":先分解再合并
- 递归结构:左半部分 + 右半部分 + 合并
- 合并关键:使用双指针技术合并两个有序数组
- 空间代价:需要额外的O(n)空间
- 稳定保证:相等时优先选择左边元素