这是我关于堆栈溢出的第一个问题所以请耐心等待。 我写了这个binarySearch函数,由于某种原因它挂起 - 我假设是因为无限循环。有人能用我的代码找到错误吗?
CASE WHEN (select Sum(MONTANT) from fraisExterne where matching=fm.id and statut=3) IS NULL
THEN select sum(MONTANT) from fraisExterne where matching=fm.id
ELSE Select sum (MONTANTHTBROKER) from fraismatching where matching=fm.id
End End as "BROKER AMOUNT"
答案 0 :(得分:4)
最明显的错误是你需要计算middle
作为第一个在循环中的操作,而不是在它之外。
如果没有这种改变,你总是在首次调用函数时检查哪个元素是“中间”,并且永远不会对搜索空间进行分区。
使用该修复程序,我的测试表明代码按要求工作,尽管在注释中建议您应该返回找到的元素的索引,而不仅仅是一个标记来说明元素是否被找到。
答案 1 :(得分:1)
发生无限循环,因为所示的实现是迭代二进制搜索,但是在每次迭代时都不会重新计算middle
值,正如其他人所提到的那样。因此,middle
变量永远不会超出第一次迭代。
如果找不到值,则下面是一个返回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;
}