思路
以升序排序为例:
-
归
把数组分成两半,再递归地对子数组进行“分”操作,直到分成一个个单独的数
-
并
把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组合并为一个完整数组
合并有序数组的操作:
- 新建一个空数组
res
,用于存放最终排序后的数组 - 比较连个有序数组的头部,较小者出队并推入
res
中 - 如果两个数组还有值,重复第二步
升序归并排序动画演示如图所示:
时间复杂度:O(nlogn)
实现
现有数组7, 5, 15, 4, 9, 3, 12, 6]
,进行升序排序:
Array.prototype.mergeSort = function() {
const rec = arr => {
// 若数组长度为一,直接返回该数
if (arr.length === 1) return arr;
// slice():左闭右开,不会改变原数组
const mid