- 归并排序的概念介绍
- 原理分析与时间复杂度说明
- 两个示例代码:
- 基础演示版 —— 帮助理解归并排序的原理
- 业务逻辑场景版 —— 演示如何在实际场景中使用归并排序
一、什么是归并排序
归并排序(Merge Sort) 是一种经典的“分而治之(Divide and Conquer)”策略的排序算法,其核心思路是:
- 将序列一分为二,分别对左右子序列进行排序;
- 将已排好序的左右子序列进行“合并”,得到完整的有序序列。
它最重要、也是最复杂的部分在于“合并(merge)”步骤:给定两个已经分别有序的子序列,如何高效地合并成一个有序序列。
归并排序具有以下特点:
- 稳定性:如果两个元素的值相等,排序后它们的相对位置不会改变(在合并时不会打乱原有顺序)。
- 可用于外部排序:当数据量非常庞大,以至于只能部分存储在内存,部分存储在磁盘或其他介质时,归并排序通常是首选方案之一。
二、原理简析
-
分(Divide)
- 若列表长度大于 1,则将其对半拆分为
left
部分和right
部分; - 分别对
left
和right
进行递归调用,直到子序列长度为 1(或 0),即“自然有序”。
- 若列表长度大于 1,则将其对半拆分为
-
治(Conquer)
- 将排好序的
left
子序列与right
子序列“归并合并”。 - 合并时,设立两个指针分别指向
left
和right
的起始位置,依次比较,将更小的元素放入结果序列,并移动指针。 - 当有一方的指针走到尽头,就将另一方剩余的所有元素直接追加到结果序列末尾。
- 将排好序的
举个简单例子:
- 原序列:
[3, 1, 6, 2]
- 分:一拆为二 ⇒
[3, 1]
和[6, 2]
;- 对
[3, 1]
再拆 ⇒[3]
和[1]
,分别排好序再合并得到[1, 3]
; - 对
[6, 2]
再拆 ⇒[6]
和[2]
,分别排好序再合并得到[2, 6]
;
- 对
- 治:将
[1, 3