概述
归并排序
是基于分治算法实现的一种排序算法,它将数组分割为两个子数组,然后对子数组进行排序,最终将子数组归并
为有序的数组.
归并排序
的时间复杂度为O(n log n)
,空间复杂度为O(1)
,并且它是稳定的排序算法(所谓稳定即是不影响值相等元素的相对次序).
算法过程
- 首先,
归并排序
需要将一个大小为n
个元素的数组分解为各包含n/2
个元素的子数组(这个分解的过程会不断进行,直到子数组元素个数为1
).
- 当子数组的元素个数为
1
时,代表这个子数组已经有序,开始两两归并(将两个个数为1
的子数组归并为一个个数为2
的子数组,不断归并,直到所有子数组个数为2
,然后继续将两个个数为2
的子数组归并为一个个数为4
的子数组….以此类推).
- 不断重复步骤2,直到整个数组有序.
归并
通过以上的了解,我们发现归并排序
中最重要的步骤就是归并
.
采用类似洗牌
的方式来理解这个过程.想象辅助数组为一个空牌堆,两个子数组为两堆牌a
和b
.我们从a
堆与b
堆中各取出一张牌进行比较,然后将较小的牌放入空牌堆中,不断重复比较直到任一牌堆为空.最后,再将未空的牌堆全部放入空牌堆中.
|
|
递归实现
只要理解了归并
的过程,剩下就很容易实现了.归并排序
的递归实现如下.
|
|
非递归实现
我们已经知道了归并排序
中最小子数组的元素个数为1
,非递归实现只需要从1
开始自底向上地归并即可(递归实现的真实计算过程也是如此,这是由于递归调用是后进先出的).
|
|
本文作者为SylvanasSun(sylvanassun_xtz@163.com),转载请务必指明原文链接.