[编程题] 归并排序

原理:递归拆分数组到容量为1的两区间,然后两两比较,再合并回来。

单步视频图文教学: https://www.youtube.com/watch?v=4VqmGXwpLqc

function mergeSort(arr: number[]): number[] {
    // 递归退出条件
    if (arr.length < 2) {
        return arr
    }
    // 拆分数组
    const mid = Math.ceil(arr.length / 2)
    const a1 = mergeSort(arr.slice(0, mid))
    const a2 = mergeSort(arr.slice(mid))
    // 合并
    return merge(a1, a2)
}

function merge(a1: number[], a2: number[]): number[] {
    const arr: number[] = [];
    while (a1.length && a2.length) {
        if (a1[0] < a2[0]) {
            arr.push(a1.shift() as number)
        } else {
            arr.push(a2.shift() as number)
        }
    }
    if (a1.length) arr.push(...a1)
    if (a2.length) arr.push(...a2)
    return arr
}

const arr = [133, 73, 327, 736, 731, 885, 605, 530, 959, 268]

console.log(mergeSort(arr)) // [73, 133, 268, 327, 530, 605, 731, 736, 885, 959] 
posted @ 2022-09-13 18:33  toddforsure  阅读(11)  评论(0)    收藏  举报