归并排序
归并排序也是采用 分而治之 的思想
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
思路:
动画参考:
代码实现
// 归并排序 (递归思想)
let arr = [12, 45, 8, 71, 23, 2, 44]
let mergeSort = arr => {
if (arr.length === 1) {
return arr
}
let left = arr.slice(0, Math.floor(arr.length / 2))
let right = arr.slice(Math.floor(arr.length / 2))
return merge(mergeSort(left), mergeSort(right))
}
// 归并排序的 核心
let merge = (a, b) => {
// 最终条件 如果该数组是空的就返回另一个数组
if (a.length === 0) return b
if (b.length === 0) return a
// 如果 左数组小于右边的 就让 a[0]连接住出除了它自己的其他数
return a[0] < b[0] ? [a[0]].concat(merge(a.slice(1), b)) : [b[0]].concat(merge(a, b.slice(1)))
}
console.log(mergeSort(arr));
归并排序的效率
时间复杂度: O(nlogn)