JavaScript 归并排序

70 阅读1分钟

归并排序是采用分治法的一个典型的应用,算法复杂度为nlogn 算法步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针到达序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾
function mergeSort(nums) {
    const merge = (left, right) => {
        let res = []
        let n1 = left.length
        let n2 = right.length
        let i = 0
        let j = 0
        while(i < n1 && j < n2){
            if(left[i] <= right[j]){
                res.push(left[i])
                i ++ 
            } else{
                res.push(right[j])
                j ++
            }
        }
        while(i < n1){
            res.push(left[i])
            i ++
        }
        while(j < n2){
            res.push(right[j])
            j ++ 
        }
        return res
    }
    
    let n = nums.length
    let mid = Math.floor(n/2)
    if (n <= 1){
        return nums
    }else{
        let left = mergeSort(nums.slice(0,mid))
        let right = mergeSort(nums.slice(mid))
        return merge(left,right)
    }
}

console.log(mergeSort([5,4,3,2,1]))
//[ 1, 2, 3, 4, 5 ]