二分查找错误 Java

Error in binary search Java

我得到了这个二进制搜索来找出它有什么问题。有一行被注释掉了,到目前为止我唯一能想到的就是删除那行,因为我认为不需要它。除此之外,我想不出任何遗漏的东西——有什么明显的错误吗?

public boolean search(int val) {
    int low = 0;
    int high = size-1;
    int middle = -1;
    boolean found = false;
    while (!found && low < high) {
        middle = low + (high-low)/2;
        if (a[middle] == val)
           found = true;
        else if (a[middle] < val)
           low = middle + 1;
        else // (a[middle] > val)
           high = middle - 1;
    }
    return found;
}

让我们开始吧,让您的代码更易于阅读...

middle = low + (high-low)/2;
if (a[middle] == val) {
  found = true;
  break;
}

if (a[middle] < val) {
  low = middle + 1; 
} else { 
  high = middle - 1;
}

我想现在更清楚了,那个评论真正在说什么 - 它只是表达了当 a[middle] > val.

时的情况

假设您的数组中有 2 个值:[0, 1],您寻找值 1。让我们 运行 代码:

int low = 0;
int high = size-1; // high = 1
int middle = -1;
boolean found = false;
while (!found && low < high) {
    middle = low + (high-low)/2; // middle = 0 + (1-0) / 2 = 0
    if (a[middle] == val) // FALSE (because a[0] = 0)
       found = true;
    else if (a[middle] < val) // TRUE (because a[0] = 0 and 0 < 1)
       low = middle + 1;  // low = 0 + 1 = 1
    else // (a[middle] > val)
       high = middle - 1;
}
return found;

因为 low = 1,你退出了循环,因为你有一个条件 low < high 和你的 return false,即使你的数组​​中存在 1。

问题出在 middle = low + (high-low)/2; 使用 int 并将向下舍入。

取你要搜索的数组为[1,2].

走代码:

开始:low = 0, high = 1。 第 1 步:middle = 0 - 不匹配 (1 < 2) 所以 low = 1。 循环检查 - low < high?否 - 停止搜索。