javascript - 为什么此合并排序代码在 python 中有效,但在 javascript 中无效
问题描述
有谁知道为什么这段代码不起作用,我在 python 中尝试了相同的代码,它运行良好。
function merge(l, m, r) {
let divider = m + 1
let l_cache = l
let out_list = []
for (let i = 0; i < r - l + 1; i++) {
if (l > m) {
out_list.push(numbers[divider])
divider += 1
} else if (divider > r) {
out_list.push(numbers[l])
l += 1
} else if (numbers[l] < numbers[divider]) {
out_list.push(numbers[l])
l += 1
} else if (numbers[l] >= numbers[divider]) {
out_list.push(numbers[divider])
divider += 1
}
}
for (let i = 0; i < out_list.length; i++) {
numbers[i + l_cache] = out_list[i]
}
}
function MergeSort(l, r) {
if (l < r) {
let m = Math.floor((l + r - 1) / 2)
MergeSort(l, m)
MergeSort(m + 1, r)
merge(l, m, r)
}
}
var numbers = [ 42, 60, 33, 79, 15, 0, 88, 62, 27, 46 ]
MergeSort(0, numbers.length - 1)
输入:[42, 60, 33, 79, 15, 0, 88, 62, 27, 46]
输出:[0, 15, 27, 33, 42, 46, 60, 46, 62 ,62]
预期输出:[0, 15, 27, 33, 42, 46, 60, 62, 79, 88]
解决方案
问题是你l
在循环体中发生了变异,但仍然在你的条件中使用它for (let i = 0; i < r-l+1; i++)
。这样合并就过早结束并且out_list
不包含它应该包含的所有内容。通过使用解决此问题
for (let i = 0; i < r-l_cache+1; i++) {
// ^^^^^^^
在 python 中,您可能使用了range()
仅评估一次并保持其停止值的 a。
或者,您可能不想依赖算术来预先确定迭代次数,而是使用结束条件
while (l <= m || divider <= r) {
推荐阅读
- javascript - 如何将 React 组件添加到由 HTML 和 CSS 组成的简单网页?
- python - 如何为我的回归任务生成随机 n 维数据集?
- reactjs - ReactJS 和 Redux 工具包:我可以使用“createAsyncThunk()”来执行非异步副作用吗?
- docker - docker坚持使用代理
- r - 当数据集是每月时,如何计算 Quarter Over Quarter %change
- github-actions - Github 操作会忽略 bash.sh 脚本中定义的所有环境变量
- xcode - Unity Firebase + AdMob 冲突 (GoogleAppMeasurement)
- reactjs - 我收到一条错误消息“未定义没有属性”,但不明白问题出在哪里
- c# - 使用 c#.net 可以使用控制台应用程序打开 excel 工作簿,但不能使用 Windows 窗体应用程序
- java - 为什么 Throwable.getCause 在返回 `null` 之前检查“原因”是否为“this”,而不是直接返回原因?