[英]Infinite Loop with my binary search implementation in JavaScript
这是我关于堆栈溢出的第一个问题,请耐心等待。 我写了这个binarySearch函数,由于某种原因它挂起了-我想是因为死循环。 谁能找到我的代码的错误?
let binarySearch = (array, value) => {
let target = value,
start = 0,
end = array.length - 1,
middle = Math.floor( (end + start)/2 )
while (start <= end){
if ( array[middle] === target ){
return true
}else if (array[middle] < target){
start = middle + 1
}else if (array[middle] > target){
end = middle - 1
}
}
return false
}
最明显的错误是,你需要计算middle
的循环中的第一个操作,而不是外界的它。
没有该更改,您将始终检查首次调用该函数时位于“中间”的哪个元素,并且永远不会对搜索空间进行分区。
有了该修复程序之后,我的测试表明该代码可以按要求工作,尽管按照注释中的建议,您应该返回找到的元素的索引,而不仅仅是返回一个用于说明是否找到该元素的标志。
发生无限循环是因为所示的实现是迭代的二进制搜索,但是正如其他人提到的那样, middle
值不会在每次迭代时重新计算。 因此, middle
变量将永远不会在第一次迭代后发生变化。
以下是一个返回value
索引的实现,如果未找到value,则返回null
。
function binarySearch(array, value) {
let middle, start = 0,
end = array.length - 1;
while (start <= end) {
middle = Math.floor((start + end) / 2);
if (array[middle] > value) {
end = middle - 1;
} else if (array[middle] < value) {
start = middle + 1;
} else {
return middle;
}
}
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.