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