js归并排序

120 阅读1分钟

思路

将数组分而治之递归到递归基,也就是只剩下一个元素时,返回。
调用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]))