簡體   English   中英

二進制搜索在Java中給出了索引超出范圍的異常

[英]Binary Search gives Index Out of Bound Exception in Java

我正在嘗試使用Java編程語言實現二進制搜索。 顯然,應該對數組進行排序以便使用二進制搜索,因為它使用了分而治之的概念。 當元素在數組中和元素不在數組中時,代碼在兩種情況下均能正常工作。 但是,當我輸入的數字大於數組中的最大數字時,程序將崩潰並給出Index Out Of Bound Exception。

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);
}

}

這應該可以解決您的問題

int upper = arr.length-1;

如果要查找的數字大於最大值,則一定要查看數組的最后一個元素。 但是在您的代碼中, upper的初始值比最后一個元素的索引大1。

您可以采用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實際上只是進行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM