-1

このメソッドがArrayIndexOutOfBounds例外をスローしている理由がわかりません。

When I change the initial "high"の値、私が検索"int high = array.length - 1;"するプログラムになります。return any integer value

私は何が間違っているのですか?

前もって感謝します!


public class BinarySearch {

public static void main(String[] args) {

    int searchValue = 12;
    int[] givenNums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    binarySearch(givenNums, searchValue);
    System.out.println("\nResult: " + searchValue);

}

public static int binarySearch(int[] array, int key) {
    int low = 0;
    int high = array.length;
    int mid = (low + high) / 2;
    int i = 0;
    System.out.println();

    while (low <= high) {
        System.out.print(i + " ");
        if (array[mid] < key) {
            low = mid + 1;
            mid = (low + high) / 2;
        } else if (array[mid] > key) {
            high = mid - 1;
            mid = (low + high) / 2;
        }
        else
            return mid;

        i++;
    }
    return -1;
}
}
4

3 に答える 3

5

包括的または排他high的のどちらが最大値を意味するかについて、一貫性を保つ必要があります。あなたはそれが排他的な上限であることから始めます:

int high = array.length;

ただし、ループ条件は、包括的な上限whileである場合にのみ適切です。

while (low <= high)

おそらくwhile条件を次のように変更する必要があります。

while (low < high)

high...そして、後での割り当ても変更します。

または、それを包括的に保ち、初期値を に変更することもできますarray.length - 1

low == high == mid == array.lengthそれは、それが爆発する場所であるという状況を止めます。

mid = (low + high) / 2また、計算をループ内の最初のステートメントに移動することをお勧めしwhileます。そうすれば、重複したコードを取り除くことができます。

while (low < high) {        
    mid = (low + high) / 2;
    System.out.print(i + " ");
    if (array[mid] < key) {
        low = mid + 1;
    } else if (array[mid] > key) {
        high = mid;
    }
    else {
        return mid;
    }
    i++;
}
于 2012-10-10T19:56:31.237 に答える
3

配列の最大インデックスは、array.length - 10 から始まるためです。

于 2012-10-10T19:55:22.937 に答える
1

Java の配列は 0 からインデックス付けされます。つまり、...

int[] arr = 新しい int[10];

最初の値は arr[0] で、最後の値は arr[9] で、長さは 10 です。

于 2012-10-10T19:56:49.060 に答える