归并实现原理-拆分
比如数组 [1, 5, 6, 2, 4, 3],归并排序的第一步,将数组一分为二: [1, 5, 6], [2, 4, 3],接着将分成的数组继续一分为二,直到长度为一,我们构成如下二叉树(成树 从上往下)
归并实现原理-归并
当递归到了尽头,我们向上回溯,对于两个有序的数组,我们将它们合并成一个有序数组,从而完成整个归并排序(归并 从下往上)
// 拆分
function mergeSort(arr) {
var mid = Math.floor(arr.length / 2)
var left_arr = arr.slice(0, mid)
var right_arr = arr.slice(mid)
return merge(left_arr, right_arr)
}
// 归并
function merge(left, right) {
var result = [] // 作为中间容器临时存放
if(left[0] < right[0]){
result.push(left.shift()) // shift返回数组第一个元素
} else {
result.push(right.shift())
}
return result.concat(left).concat(right)
}
var arr = [6,4]
console.log(mergeSort(arr))
控制台输出
但输入三个值后,需要继续拆分,使用递归
// 拆分
function mergeSort(arr) {
if (arr.length == 1) {
return arr
}
var mid = Math.floor(arr.length / 2)
var left_arr = arr.slice(0, mid)
var right_arr = arr.slice(mid)
return merge(mergeSort(left_arr), mergeSort(right_arr))
}
// 归并
function merge(left, right) {
var result = [] // 作为中间容器临时存放
while (left.length > 0 && right.length > 0) {
if (left[0] < right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
return result.concat(left).concat(right)
}
var arr = [6, 8, 2, 3, 4]
console.log(mergeSort(arr))
控制台输出