You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript归并排序(Merge Sort)代码异常,请求排查错误

归并排序代码错误排查与修复

你的代码存在几个关键问题,导致无法正确实现归并排序,以下是具体问题和修复方案:

1. 递归逻辑缺失(核心错误)

mergeSort函数仅将数组拆分为两个子数组,但没有递归调用自身对这两个子数组进行排序。归并排序的核心是先递归拆分到最小单元,再排序合并,现在直接合并未排序的子数组,自然得不到正确结果。

修复方法:在合并前,先递归排序两个子数组:

mergeSort: function (a) {
    let n = a.length;
    if (n <= 1) return a;
    let c = Array.from({ length: Math.floor(n / 2) }, (_, i) => a[i]);
    let d = Array.from({ length: n - c.length }, (_, i) => a[c.length + i]);
    // 递归排序两个子数组后再合并
    return this.mergeTwoSortedArrays(this.mergeSort(c), this.mergeSort(d));
}

2. 合并函数的循环条件错误

mergeTwoSortedArrays中的while循环条件i < A.length && j < B.length && A[i] || B[j]逻辑混乱:

  • 逻辑运算符优先级导致条件等价于(i < A.length && j < B.length && A[i]) || B[j],会出现两种错误情况:
    • 当A[i]为0时,会被判定为false,提前退出循环,遗漏后续元素
    • 当其中一个数组遍历完后,B[j]存在时会继续执行循环,导致数组越界

修复方法:只保留i < A.length && j < B.length作为循环条件,确保两个数组都未遍历完时才进行比较合并:

while (i < A.length && j < B.length) {
    if (A[i] < B[j]) {
        C[k] = A[i];
        i++;
        k++;
    } else {
        C[k] = B[j];
        j++;
        k++;
    }
}

3. 命名冗余(非功能性问题)

solve函数中变量名count不符合实际用途,因为mergeSort返回的是排序后的数组,而非计数,建议改为sortedArray提升代码可读性:

solve: function (A) {
    let sortedArray = this.mergeSort(A);
    return sortedArray;
}

完整修复后的代码

{
    solve: function (A) {
        let sortedArray = this.mergeSort(A);
        return sortedArray;
    },
    mergeTwoSortedArrays: function (A, B) {
        let i = 0;
        let j = 0;
        let k = 0;
        let C = [];
        while (i < A.length && j < B.length) {
            if (A[i] < B[j]) {
                C[k] = A[i];
                i++;
                k++;
            } else {
                C[k] = B[j];
                j++;
                k++;
            }
        }
        while (j < B.length) {
            C[k] = B[j];
            k++;
            j++;
        }
        while (i < A.length) {
            C[k] = A[i];
            k++;
            i++;
        }
        return C;
    },
    mergeSort: function (a) {
        let n = a.length;
        if (n <= 1) return a;
        let c = Array.from({ length: Math.floor(n / 2) }, (_, i) => a[i]);
        let d = Array.from({ length: n - c.length }, (_, i) => a[c.length + i]);
        return this.mergeTwoSortedArrays(this.mergeSort(c), this.mergeSort(d));
    }
}

内容的提问来源于stack exchange,提问作者User009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:56:15