我是一名 Java 初学者,我正在尝试编写二分搜索算法的实现。
这是我的代码:
protected int doSearch(List<Integer> list, int key) throws SearchException{
int min = 0;
int max = list.size()-1;
while(max > min){
int mid = min + ((max-min)/2);
if(list.get(mid)==key){
return mid;
}
else if(list.get(mid) < key){
min = mid +1 ;
}
else{
max = mid - 1;
}
}
throw new SearchException("");
}
我尝试从此链接复制它http://en.wikipedia.org/wiki/Binary_search_algorithm并尝试让它适用于列表。
输入列表为[1, 2, 3, 4, 5, 7, 9]
如果我搜索键2
,输出是1
,这很好,但是如果我尝试例如1
,则会引发SearchException .
我无法解释为什么。我尝试通过在纸上复制代码来调试代码,但它在纸上有效。
谢谢!
最佳答案
您目前对于 max
是否是包含下限的问题不一致,如下所示:
int max = list.size()-1;
...
max = mid - 1;
或独占下限,如下所示:
while (max > min)
只要你保持一致,你就可以让它发挥作用。就我个人而言,我建议使用独占上限,因为这与 list.size()
和一般计算机科学等内容一致。因此,如果 mid
太大,则需要将 max
更改为等于 mid
。您的代码将如下所示:
int max = list.size(); // Note change here
while(max > min) {
int mid = min + ((max - min) / 2);
if (list.get(mid) == key) {
return mid;
} else if (list.get(mid) < key) {
min = mid +1 ;
} else {
max = mid; // Note change here
}
}
(我对格式进行了修改,以便在我看来更容易阅读。看看您是否喜欢。)
关于java - BinarySearch 实现在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203382/