归并排序

122 阅读1分钟

归并排序:将数组进行二分法拆分,直到拆分至左右两侧长度为2,然后左右两侧分别进行排序,排序结束后回归到上一步的二分法拆分,重复递归至二分法拆分结束

图解(来源网络资源图片) v2-cdda3f11c6efbc01577f5c29a9066772_b.gif

代码实现

// 排序实现
function sortCb(left = [], right = []){
    let result = [];
    
    while(left.length && right.length){
        if(left[0] > right[0]){
            result.push(right.shift())
        }else{
            result.push(left.shift())
        }
    }
    
    // 比较完 剩余直接push
    if(left.length){
        result = result.concat(left)
    }
    
    if(right.length){
        result = result.concat(right)
    }
    
    return result;
}

// 递归处理
function mergeSort(arr = []){
    if(arr.length < 2){
        return arr;
    }
    
    let middle = Math.floor(arr.length / 2);
    let left = arr.slice(0,middle);
    let right = arr.slice(middle);
    
    return sortCb(mergeSort(left),mergeSort(right))
}