归并排序学习整理

目录

  • 归并排序
    • 分而治之
    • 合并相邻有序子序列
    • JavaScript代码实现
    • 运行流程输出
    • 算法分析
    • 参考资料

归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序其实要做两件事:
(1)“分解”——将序列每次折半划分。
(2)“合并”——将划分后的序列段两两合并后排序。

分而治之

归并排序学习整理_第1张图片

合并相邻有序子序列

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8][1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
归并排序学习整理_第2张图片

JavaScript代码实现

function mergeSort(arr) {
    const merge = (left, right) => {
        let res = [];

        while (left.length > 0 && right.length > 0) {
            res.push(left[0] <= right[0] ? left.shift() : right.shift());
        }

        res.push(...left, ...right); // 存在left和right还有剩余元素的情况

        return res;
    };

    if (arr.length === 1) {
        return arr;
    }
    let middle = Math.floor(arr.length / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);

    return merge(mergeSort(left), mergeSort(right));
}

运行流程输出

其中d1,d2...dn为分解输出,m1,m2...mn为合并输出
归并排序学习整理_第3张图片

算法分析

归并排序学习整理_第4张图片

参考资料

排序七 归并排序

图解排序算法(四)之归并排序

【MDN】Array.prototype.slice

【百度百科】 归并排序

你可能感兴趣的:(前端,算法,归并排序,算法,排序)