介绍
将两个有序数列合并成一个有序数列
根据实现方式分为“从上往下”和“从下往上”两种方式
分析图使用的graphviz
从下往上(非递归实现)
分析
将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止
c实现
1 | /** |
Swift实现
1 | /// 合并两个有序数组 |
从上往下(递归实现)
分析
分解: 将当前区间一分为二,及中间点 mid = (low + high) / 2
求解: 递归对左区间[low…mid]和右区间[mid + 1…high]进行递归排序。递归的结束条件是子区间长度为1
合并: 将已排序的左区间[low…mid]和右区间[mid + 1…high]归并为一个有序区间[low…high]
C实现
1 | /** |
Swift实现
1 | /// 合并两个有序数组 |
总结
时间复杂度:
- 最差O(nlogn)
最优O(nlogn)
平均O(nlogn)
空间复杂度:
- O(n)
稳定性:
- 稳定