思路
将数组分而治之递归到递归基,也就是只剩下一个元素时,返回。
调用merge函数将递归基返回的两个序列排序并合并为一个序列,并返回。
merge函数合并两个序列时若有一个序列为空,则另一个序列剩下的肯定是比前面的大的元素并且是有序的,将其追加在有序序列后面即可。
分治函数依次出栈,每次返回的都是将上两次递归返回的序列merge合并后的有序序列。
直到分治函数完全出栈,最终得到一个有序序列(数组)。
代码
function mergeSort(arr) {
if(arr.length<=1) return arr
let mid = Math.floor(arr.length/2)
let left = arr.slice(0,mid)
let right = arr.slice(mid)
left = mergeSort(left)
right = mergeSort(right)
return merge(left,right)
}
function merge(left,right) {
let result = []
while (left.length&&right.length){
left[0]<=right[0]?
result.push(left.shift()) :
result.push(right.shift())
}
return result.concat(left,right)
}
console.log(mergeSort([2,3,4,1,2,9,6,5,8]))