使用JavaScript中的二进制搜索实现的无限循环

时间:2017-07-03 16:19:39

标签: javascript binary-search

这是我关于堆栈溢出的第一个问题所以请耐心等待。 我写了这个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"

2 个答案:

答案 0 :(得分:4)

最明显的错误是你需要计算middle作为第一个循环中的操作,而不是在它之外。

如果没有这种改变,你总是在首次调用函数时检查哪个元素是“中间”,并且永远不会对搜索空间进行分区。

使用该修复程序,我的测试表明代码按要求工作,尽管在注释中建议您应该返回找到的元素的索引,而不仅仅是一个标记来说明元素是否被找到。

答案 1 :(得分:1)

发生无限循环,因为所示的实现是迭代二进制搜索,但是在每次迭代时都不会重新计算middle值,正如其他人所提到的那样。因此,middle变量永远不会超出第一次迭代。

如果找不到值,则下面是一个返回valuenull索引的实现。

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;
}