MergeSort算法输出异常求助:传入(6,3,5)返回[3,3,5]
问题分析与修复
核心错误点
- 未声明的全局变量:
leftArraySorted和rightArraySorted没有用let或const声明,变成了全局变量。递归调用mergeSort时,后续的递归会覆盖这两个变量的值,导致合并阶段使用的不是当前递归层级对应的左右有序数组,而是最后一次递归的结果——这是输出错误的主要原因。 - 合并逻辑的冗余与顺序问题:原代码用
for循环强制遍历原数组长度,判断顺序不合理。当其中一个数组遍历完毕(对应索引的元素为undefined),前面的</>/===条件都不会触发,虽然后续能走到undefined判断,但结合全局变量的问题会进一步放大错误;另外,当左右元素相等时,只推入了左边元素,存在逻辑漏洞。 - 调用方式错误(推测笔误):你写的
mergeSort(6, 3, 5)没有传入数组,正确的调用应该是mergeSort([6, 3, 5]),否则函数会因为array是数字类型而报错。
修复后的代码
function mergeSort(array) { if (array.length === 1) return array // 用const声明局部变量,避免全局污染 const leftArraySorted = mergeSort(array.slice(0, Math.floor(array.length / 2))) const rightArraySorted = mergeSort(array.slice(Math.floor(array.length / 2))) let a = 0 let b = 0 const mergedSortedArray = [] // 先合并两个数组都有元素的部分 while (a < leftArraySorted.length && b < rightArraySorted.length) { if (leftArraySorted[a] < rightArraySorted[b]) { mergedSortedArray.push(leftArraySorted[a]) a += 1 } else if (leftArraySorted[a] > rightArraySorted[b]) { mergedSortedArray.push(rightArraySorted[b]) b += 1 } else { // 相等时同时推入左右元素,避免遗漏 mergedSortedArray.push(leftArraySorted[a]) mergedSortedArray.push(rightArraySorted[b]) a += 1 b += 1 } } // 处理左数组剩余元素 while (a < leftArraySorted.length) { mergedSortedArray.push(leftArraySorted[a]) a += 1 } // 处理右数组剩余元素 while (b < rightArraySorted.length) { mergedSortedArray.push(rightArraySorted[b]) b += 1 } return mergedSortedArray } // 正确调用示例 console.log(mergeSort([6, 3, 5])) // 输出 [3, 5, 6]
修复说明
- 给
leftArraySorted和rightArraySorted添加const声明,确保每个递归层级的变量都是局部的,不会被其他递归调用覆盖。 - 把原有的
for循环改成更合理的while循环:先合并两个数组都有元素的部分,再单独处理剩余元素,逻辑更清晰,避免了强制遍历原数组长度带来的错误。 - 修复了相等元素的处理逻辑,确保左右相等的元素都被正确推入结果数组。
- 修正了调用方式,传入数组参数而非独立数值。
内容的提问来源于stack exchange,提问作者CyberM
相关产品推荐
相关产品推荐

