joken-前端工程师

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

在 JavaScript 中实现归并排序可以通过递归的方式完成。归并排序使用了“分而治之”的策略,将数组递归地分成两个子数组,分别进行排序,然后将它们合并成一个有序数组。以下是一个简单的归并排序实现:

function mergeSort(arr) {
    // 如果数组只有一个元素或为空,则直接返回数组
    if (arr.length <= 1) {
        return arr;
    }

    // 找到数组的中间点
    const mid = Math.floor(arr.length / 2);

    // 将数组分成两部分
    const left = arr.slice(0, mid);
    const right = arr.slice(mid);

    // 递归地对左右两部分进行排序并合并
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    const result = [];
    let i = 0;
    let j = 0;

    // 合并两个有序数组
    while (i < left.length && j < right.length) {
        if (left[i] < right[j]) {
            result.push(left[i]);
            i++;
        } else {
            result.push(right[j]);
            j++;
        }
    }

    // 将剩余的元素添加到结果中
    return result.concat(left.slice(i)).concat(right.slice(j));
}

// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray);

代码解释

  1. mergeSort 函数

    • 如果数组的长度小于等于1,直接返回数组,因为这种情况下不需要排序。
    • 找到数组的中间点 mid,将数组分成两部分:左部分 left 和右部分 right
    • 递归调用 mergeSort 对左右两部分进行排序,然后调用 merge 函数将两部分合并。
  2. merge 函数

    • 初始化一个空数组 result 来存储合并后的结果。
    • 使用两个指针 ij 分别遍历 leftright 数组。
    • 比较 leftright 中的元素,将较小的元素添加到 result 中,指针相应地移动。
    • 将剩余的元素(如果有)添加到 result 中。

示例

const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray); // 输出: [1, 1, 2, 3, 6, 8, 10]

这个实现展示了如何使用递归和合并步骤来完成归并排序。归并排序的时间复杂度始终为 (O(n \log n)),并且是稳定排序,适用于需要保持相同元素相对顺序的场景。

原理图

image

posted on 2024-07-14 10:02  joken1310  阅读(1)  评论(0编辑  收藏  举报