二进制搜索在Java中提供索引超出范围的异常

时间:2015-03-28 20:21:31

标签: java arrays algorithm search binary

我正在尝试使用java编程语言实现二进制搜索。 很明显,应该对数组进行排序以便使用二进制搜索,因为它使用了分而治之的概念。当元素在数组内时和不在时,代码适用于两种情况。但是,当我输入的数字大于数组中的最大数字时,程序将崩溃并给出Index Out Of Bound异常。

public class Binary {

public static void search(int arr[]) {
    Scanner in = new Scanner(System.in);
    int upper = arr.length;
    int lower = 0;
    int middle = 0;
    int flag = 0;
    int key;

    /*
     * flag = 0 ---> not found yet.
     * flag = 1 ---> element is found.
     * flag = 2 ---> no such element.
     */

    System.out.println("Enter the number that you want to find... ");
    key = in.nextInt();

    while (flag == 0) {
        middle = (int) (lower + upper) / 2;

        if (key == arr[middle]) {
            flag = 1;
        }

        if (key < arr[middle]) {
            upper = middle - 1;
        } else if (key > arr[middle]) {
            lower = middle + 1;
        }
        if (lower > upper) {
            flag = 2;
        }
    }
    if (flag == 1) {
        System.out.println(arr[middle] + " has been found, its index is: "
                + middle);
    } else
        System.out.println("Error, no such element.");
}

public static void main(String[] args) {

    int arr[] = { 2, 4, 6, 8, 11, 34, 56 };
    search(arr);
}

}

2 个答案:

答案 0 :(得分:1)

这应该可以解决您的问题

int upper = arr.length-1;

如果您要查找的数字大于最大数字,那么您一定要查看数组的最后一个元素。 但是在您的代码upper中,初始值比最后一个元素的索引多1。

答案 1 :(得分:0)

您可以使用MisterDev的解决方案并更正上限。通常,在Java数组中,下限是包含的,上限是独占的,但我喜欢lowerupper遵循此模式的想法。

然后,lower < upper表示范围不为空,中间点将在上半年继续搜索时成为新的独占上限:

public static int search(int arr[], int key)
{
    int upper = arr.length;
    int lower = 0;

    while (lower < upper) {
        int middle = (lower + upper) / 2;

        if (key == arr[middle]) return middle;

        if (key < arr[middle]) {
            upper = middle;
        } else if (key > arr[middle]) {
            lower = middle + 1;
        }
    }

    return -1;
}

我已经使该函数将键作为参数并返回索引,如果找不到键则返回-1。在我看来,用户输入和flag代码中没有业务;你应该为它编写一个包装器,以便Binary.search真正进行搜索。