比较合并
;演示如下:
3 1 5 23 1 | 5 23 | 1 | 5 | 21 3 | 2 51 2 3 5
// 可以把它当成分函数var mergeSort = function(arr) {// 将数组 arr 拆分成 [0, point) 和 [point, arr.length] 两部分const point = arr.length / 2const left = arr.slice(0, point)const right = arr.slice(point, arr.length)if (arr.length === 1) {return arr}return merge(mergeSort(left), mergeSort(right))}// 可以当作是合函数function merge(left, right) {let l = 0 // 第一个数组的下标let r = 0 // 第二个数组的下标const result = []while (l < left.length && r < right.length) {if (left[l] < right[r]) {result.push(left[l])l++} else {result.push(right[r])r++}}while (l < left.length) {result.push(left[l])l++}while (r < right.length) {result.push(right[r])r++}return result}
归并排序与快速排序都是用递归来实现的算法, 都是分分合合的过程。区别在于归并排序在合的过程中进行排序, 快速排序则在分的过程中进行排序。另外它们的时间复杂度都为 O(nlogn)。