我是一名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。
我无法解释原因。我尝试通过在纸上复制代码来调试代码,但它在纸上起作用。
谢谢!
答案 0 :(得分:3)
您目前对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
}
}
(我已经摆弄了格式化,以便更容易阅读IMO。看看你是否喜欢它。)
答案 1 :(得分:0)
最简单的解决方法是改变:
while (max > min) {
为:
while (max >= min) {
您在上面抛出异常,因为您没有处理这种情况。