我已经获得了这个二进制搜索,以找出它的错误。有一条线被注释掉,到目前为止,我唯一能想到的就是删除那条线,因为我觉得不需要它。除此之外,我想不出任何遗漏 - 是否有一些非常明显的错误?
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;
}
答案 0 :(得分:1)
当您在数组中有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
并且返回false,即使数组中存在1。
问题来自middle = low + (high-low)/2;
使用int并将向下舍入的事实。
答案 1 :(得分:0)
让我们进入并让您的代码更容易阅读...
middle = low + (high-low)/2;
if (a[middle] == val) {
found = true;
break;
}
if (a[middle] < val) {
low = middle + 1;
} else {
high = middle - 1;
}
我认为现在它变得更加清晰,这个评论真的在说什么 - 它只是表达了这种情况,当[中]&gt; VAL。
答案 2 :(得分:0)
将您搜索的数组设为[1,2]
。
走代码:
开始:low = 0, high = 1
。
第1步:middle = 0
- 不匹配(1 < 2
)所以low = 1
。
循环检查 - low < high
?不 - 停止搜索。