归并排序(先递分两半,然后归时依次取最小值组合)

分治策略,递归。递的时候先到最小单元(length===1),然后在第一次归的时候,拿出左右两个数组的值做比较,按序放到一个新数组返回,继续归的时候,新排序的左右数组length就不为1了,所以其实在第一次加一层遍历,当左右数组的length不为0的时候,依次比较左边第一个和右边第一个,拿出更小的那个放到新数组,依次。。。升序排列

let arr = [29, 10, 19, 9, 33];
let rec = (arr) => {
    if(arr.length <= 1) {
        return arr
    }
    const midPoint = Math.floor(arr.length / 2);
    const left = arr.slice(0, midPoint);
    const right = arr.slice(midPoint);
    const orderLeft = rec(left);
    const orderRight = rec(right);
    // console.log(orderLeft, orderRight, arr);
    let temp = [];
    // 从新排序的左右数组中,逐个*取出*最小值放到temp中(排序)
    while(orderLeft.length && orderRight.length) {
        if(orderLeft[0] < orderRight[0]) {
            // 一定是shift()将最小值拿出
            temp.push(orderLeft.shift());
        }else {
            temp.push(orderRight.shift());
        }
    }
    // 拼接剩下的(orderLeft, orderRight长度不一致的情况)
    temp = temp.concat(orderLeft, orderRight);
    console.log('temp', temp);
    return temp
}
rec(arr)

时间复杂度:O(nlogn),以时间换空间
空间复杂度:O(n)

results matching ""

    No results matching ""