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
相关产品推荐
相关产品推荐

