BinarySearch Implementation在某些情况下不起作用

时间:2015-01-28 22:10:23

标签: java search

我是一名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。

我无法解释原因。我尝试通过在纸上复制代码来调试代码,但它在纸上起作用。

谢谢!

2 个答案:

答案 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) {

您在上面抛出异常,因为您没有处理这种情况。