Javascript 提高我的二进制搜索算法的速度

Javascript 提高我的二进制搜索算法的速度,javascript,algorithm,binary-search,Javascript,Algorithm,Binary Search,我已经用JavaScript编写了一个二进制搜索算法: function binarysearch(number, array) { let left = 0; let right = array.length - 1; let middle; while (right != left) { middle = Math.floor(left + (right - left) / 2); if (array[middle] == number) {

我已经用JavaScript编写了一个二进制搜索算法:

function binarysearch(number, array) {
  let left = 0;
  let right = array.length - 1;
  let middle;

  while (right != left) {

    middle = Math.floor(left + (right - left) / 2);
    if (array[middle] == number) {
      return middle;
    }
    if (array[middle] < number) {
      left = array[middle];
      if (array[middle + 1] == number) {
        return middle + 1;
      }
    }
    if (array[middle] > number) {
      right = array[middle];
      if (array[middle - 1] == number) {
        return middle - 1;
      }
    }
  }
  return -1;
}
我想问一下,我是否可以改进这个算法以更快地搜索,或者这里是否犯了一些错误

编辑:

感谢大家的帮助,此解决方案现在应该可以正常工作了:

function binarysearch(number, array) {
      let left = 0;
      let right = array.length - 1;
      let middle;
      while (left <= right) {
        middle = Math.floor(left + (right - left) / 2);
        if (array[middle] == number) {
          return middle;
        }
        if (array[middle] < number) {
          left = middle + 1;
        }
        if (array[middle] > number) {
          right = middle - 1;
        }
      }
      return -1;
    }
让它更容易

  let left = 0;
  let right = array.length - 1;
  let middle;

  while (right != left) {

    middle = Math.floor(left + (right - left) / 2);
    if (array[middle] == number) {
      return middle;
    }
    if (array[middle] < number) {
      left = array[middle] + 1;
    }
    if (array[middle] > number) {
      right = array[middle];
    }
  }
  return -1;
}

您将值作为索引。如果取的值大于索引,则会看到代码不起作用

相反,如果找不到,可以将middle索引作为left或right

函数binarysearchnumber,数组{ 设左=0, 右=array.length-1, 中间的 左数右=中-1; 左=中+1; } 返回-1; } console.logbinarysearch0[43,44,45,46,47,48,49,50]; console.logbinarysearch43[43,44,45,46,47,48,49,50]; console.logbinarysearch44[43,44,45,46,47,48,49,50]; console.logbinarysearch45[43,44,45,46,47,48,49,50]; console.logbinarysearch46[43,44,45,46,47,48,49,50]; console.logbinarysearch47[43,44,45,46,47,48,49,50]; console.logbinarysearch48[43,44,45,46,47,48,49,50]; console.logbinarysearch49[43,44,45,46,47,48,49,50]; console.logbinarysearch50[43,44,45,46,47,48,49,50]; console.logbinarysearch100[43,44,45,46,47,48,49,50];
.as控制台包装器{max height:100%!important;top:0;}如果代码按预期工作,这将更适合。但它是否工作?“左”和“右”是数组中的索引,但它们被指定为数组值。边界是包含的,因此它可能应该是left=middle+1和right=middle-1。中间±1处的附加检查没有用,看起来好像是在掩盖真正的问题。哦,我不知道代码审查exist@MOehm它是有效的,我用1亿个数字的排序数组测试了它,它给了我正确的索引。如果找不到,它会给我-1。我测试了它与带有for循环的线性搜索的比较,速度要快得多。我将它与性能进行了比较。现在时间大约是0.12对102。听到它能工作,我很惊讶。代码看起来被破坏了。我刚刚试着找到数组[3,5,7,8,9,12,14,16]中从0到20的所有数字,我得到了一个无限循环。你的测试是什么样的?一百万个连续数字,从1开始?如果你把数组值和索引混在一起,这可能会起作用,并且可以解释散乱的伪+1。是的,这更容易。不幸的是,这个函数和OP的代码有着同样的问题:它混淆了数组索引和值。例如,它应该是left=middle+1。您还应该决定是否要使用包含性上界,在这种情况下是right=middle-1还是exclusive上界,在这种情况下是right=array.length。考虑到Javascript对数组使用排他性上界,我更喜欢后者。