繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM