MergeSort
归并排序(Merge sort),是创建在归并操作上的一种基于比较的排序算法。1945 年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
归并排序(Merge sort)
基本原理
归并排序算法是分治策略实现对 n 个元素进行排序的算法。
其基本思想是:将待排序元素分成大小大致相同的 2 个子集合,分别对 2 个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
算法步骤
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤 3 直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
算法图解
参考 dreamcatcher-cx 博客 图解排序算法(四)之归并排序
采用经典的分治(divide-and-conquer)策略(分治法将问题分解成规模更小、解法相同的子问题,然后通过子问题的解构造出原问题的解)。
分阶段是递归拆分子序列的过程,递归深度为 \(log_2 n\).
对于治阶段,需要将两个已经有序的子序列合并成一个有序序列,例如上图中的最后一次合并,要将 [4,5,7,8] 和 [1,2,3,6] 两个已经有序的子序列,合并为最终序列 [1,2,3,4,5,6,7,8] ,具体实现步骤如下:
动画演示
参考实现
1 | import java.util.Arrays; |
复杂度分析
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
归并排序 | \(O(nlogn)\) | \(O(nlogn)\) | \(O(nlogn)\) | \(O(n)\) | Out-place | 稳定 |
References
https://en.wikipedia.org/wiki/Merge_sort