概述
归并排序是基于分治算法实现的一种排序算法,它将数组分割为两个子数组,然后对子数组进行排序,最终将子数组归并为有序的数组.
归并排序的时间复杂度为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),转载请务必指明原文链接.