java - BinarySearch 实现在某些情况下不起作用

标签 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 .

我无法解释为什么。我尝试通过在纸上复制代码来调试代码,但它在纸上有效。

谢谢!

最佳答案

您目前对于 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/

相关文章:

java - servlet 和 JSP 的使用

java - 防止并发插入中的句点交叉

java - 如何从数组中的 search() 方法返回单个打印语句?

regex - Github 问题部分匹配

java - 线程到达末尾但未被删除

java - hamcrest containsInAnyOrder 仅适用于特定订单

php - 数组中的ElasticSearch匹配组合

mysql - 使用 2 个表中的数据对列进行全文搜索

java - 玩2 - Zentask Java教程 - jUnit ebean测试失败

java - 如何使用 JTextField 和 JButton 搜索包含 string、int 和 double 的数组列表