BinarySearch不会结束

时间:2015-12-05 20:46:58

标签: java binary-search

所以基本上,我知道在有序列表上执行二进制搜索只是为了它才能工作,所以这里是我正在使用的列表:

Integer[] x = {1, 2, 3, 4, 5, 6};

所以基本上它找到了一个整数,但是当我把一个不在列表中的值时,它似乎没有结束!这是我的代码:

public static <K extends Comparable<K>> boolean binarySearch(K[] list, K item) {
    int start = 0;
    int last = list.length - 1;

    while(start <= last) {
        int middle = (start + last) / 2;
        if(list[middle].equals(item))
            return true;
        else {
            if(item.compareTo(list[middle]) < 0)
                last = middle--;
            else
                start = middle++;
        }
    }
    return false;
}

3 个答案:

答案 0 :(得分:3)

罪犯是library(rpart) fit <- rpart(Mileage ~ Weight, car.test.frame) par(mfrow = c(1, 2)) plot(fit) text(fit) plot(fit) text(fit, cex = 0.5) last = middle--;

后递增和后递减运算符返回操作数的之前的值,而不是更新的值。因此,当您致电start = middle++;时,这会有效地将last = middle--;减少1并将middle设置为last middle。< / p>

让我们考虑你搜索7,看看为什么它进入无限循环。该项始终位于中间元素之后,因此middle-1设置为start,最终将成为数组的最后一个元素。但是从middle开始,它始终低于或等于start = middle;因此你永远不会退出我们已经多次到达last状态,我们永远无法退出。

在这里,您不应该使用这些运算符:当要搜索的项目位于中间元素之前时,让start = last = middle;当要搜索的项目位于中间元素之后时,请last = middle-1;

答案 1 :(得分:2)

问题在于您确定middle的部分。在start = 4last = 5middle始终为4的情况下。无限循环将在所有情况下发生,其中.5被截断,因为这是int

答案 2 :(得分:0)

如果您不想,您不需要实现自己的二进制搜索算法。 Arrays类提供了几种不同的实现,并且您可以在那里找到合适的实现。对于上面提到的示例,有一个用于int[] int binarySearch(int[] a, int key),另一个用于可能感兴趣的通用对象int binarySearch(T[] a, T key, Comparator c)