JavaScript版归并排序代码失效问题排查求助
问题分析与修复方案
你的归并排序代码无法正常工作的核心原因是未使用块级作用域变量声明,导致递归过程中全局变量被意外覆盖,破坏了分治逻辑。以下是具体问题和修复步骤:
1. 核心问题:全局变量污染
代码中mid、k、q、w这些变量都没有用let/const声明,默认成为全局变量。在递归调用merge和sort时,这些变量会被后续的递归调用修改,导致分治的边界计算完全错误,最终只有最后一次合并操作生效。
2. 次要问题:冗余的引用赋值
let sorted_arr = arr; 只是给原数组起了别名,两个变量指向同一个内存地址,完全没必要,直接操作原数组或者创建新数组即可。
修复后的完整代码
let arr = [8, 7, 6, 5, 4, 3, 2, 1]; merge(arr, 0, arr.length - 1); console.log('sorted_arr==', arr); // Array [1, 2, 3, 4, 5, 6, 7, 8] function merge(arr, lb, hb) { if (lb >= hb) return; // 用const声明mid,避免全局污染 const mid = Math.floor((hb + lb) / 2); merge(arr, lb, mid); merge(arr, mid + 1, hb); sort(arr, lb, mid, hb); } function sort(arr, lb, mid, hb) { let b = []; let i = lb, j = mid + 1; // 用let声明k let k = 0; while (i <= mid && j <= hb) { if (arr[i] <= arr[j]) { b[k] = arr[i]; i++; k++; } else { b[k] = arr[j]; j++; k++; } } while (i <= mid) { b[k] = arr[i]; i++; k++; } while (j <= hb) { b[k] = arr[j]; j++; k++; } // 用let声明q和w for (let q = 0, w = lb; q < b.length; q++, w++) { arr[w] = b[q]; } }
关键修改说明
- 给所有局部变量添加
let/const声明,确保每个递归调用都有独立的变量上下文,彻底避免全局变量污染。 - 移除冗余的
sorted_arr变量,直接操作原数组(如果需要保留原数组,可以在调用前创建副本传入)。 - 用
Math.floor替代parseInt计算mid,逻辑更清晰,避免字符串转换带来的潜在问题。
内容的提问来源于stack exchange,提问作者prashant verma
相关产品推荐
相关产品推荐

