概念
归并排序就是利用归并的思想实现的排序算法。归并排序的原理:假设初始序列含有n个记录,该序列可以看成n个有序的子序列,其中每个子序列的长度为1,然后两两归并,得到⌈n/2⌉(⌈x⌉表示不小于x的最小整数)个长度为2或者1的子序列,然后再两两归并,……,如此重复直到得到1个长度为n的有序序列为止。
递归式归并
演示
比如我们待排序的数组是 {9, 1, 5, 8, 3, 7, 4, 6, 2},那么递归式的归并排序为流程为:
1 | [9, 1, 5, 8, 3, 7, 4, 6, 2] |
Java实现
1 | // 定义接口 |
复杂度
时间复杂度:
因为归并的递归操作其实就是二叉树的结构,故而,最好情况 = 最坏情况 = 平均情况 = O(nlogn)
空间复杂度:
因为递归式归并需要(1)与原始记录相同大小的空间来存放归并的结果以及(2)深度为logn的栈空间,所以空间复杂度为O(n+logn)
非递归式归并
演示
又比如我们待排序的数组是 {9, 1, 5, 8, 3, 7, 4, 6, 2},那么非递归式的归并排序为流程为:
1 | [9] [1] [5] [8] [3] [7] [4] [6] [2] |
Java实现
1 | // 非递归式归并排序 |
复杂度
时间复杂度:
同递归式归并,最好情况 = 最坏情况 = 平均情况 = O(nlogn)
空间复杂度:
非递归式归并不需要保存方法栈信息,所以空间复杂度为O(n)
所以非递归的递归算法性能要高于递归式归并算法。