0

わかりました...私は、最も一般的にはバケットソートとして知られている独自のバージョンのビンソートを実装しようとしています。プログラムを実行すると、indexOutOfBounds エラーが発生します。理由はわかりません。誰かが理由を説明してください。binsort アルゴリズムは実行されないことに注意してください。Int n は配列の長さ、m は 0 から 100 までの乱数ジェネレーターによって生成されるリストの上限です。

public static void binSort (int []array, int n, int m)
{
//create upperbounds
int x = m / 3;                    //33
int y = n - x;                    //67
int z = n;                        //100

int []temp1 = new int [n-1];
int []temp2 = new int [n-1];
int []temp3 = new int [n-1];

for (int i: array)
{
    if(array[i] < x)
    {
        temp1[i] = array[i];
    }
    else if(array[i] < y)
    {
        temp2[i] = array[i];
    }
    else
    {
        temp3[i] = array[i];     
    }
}

for ( int j = 0; j <= x; j++)
    array[j] = temp1[j];
for ( int k = x + 1; k <= y; k++)
    array[k] = temp2[k];
for ( int l = y + 1; l <= z; l++)
    array[l] = temp3[l];

}
4

3 に答える 3

5

enhanced forそこにループのわずかな誤用があります。

for (int i: array)

ここで、iはインデックスではなく の要素ですarray。が反復するたびにfor、これが自動的に行われます。

for(int index = 0; index < array.length; index++) {
    int i= array[index];

簡単に言えforば、 が反復を処理するので、i要素を使用するだけです。

于 2012-10-09T17:38:50.377 に答える
2

-最初の間違い

  for (int i: array)

上記のfor-eachループでは、反復ごとに、配列の連続するインデックス値が i に入ります。したがって、 i はインデックスではなく値です。

したがって、array[i] は間違っています。

このようなものを使用してください...

for(int index = 0; index < array.length; index++) {
    int i= array[index]

-for ( int j = 0; j <= x; j++)第二に、そうあるべきだと思いますj < x

于 2012-10-09T17:40:43.880 に答える
0

temp3[]サイズがありますn-1。つまり、最後の要素は index になりますn-2。であるためz = n、これは と同じになりtemp3[z-2]ます。ただし、最後の for ループでlは value に到達します。zつまりtemp3[l]、IndexOutOfBounds Exception がスローされます。

 int z = n;                        //100
 int []temp3 = new int [n-1];      //last element of temp3 will be at tempt3[z-2]
 for ( int l = y + 1; l <= z; l++) //l will iterate from y + 1 to z
   array[l] = temp3[l];     // temp3[l] will throw indexOutOfBounds when z>=l>z-2

編集:また、他の人がすでに指摘しているように、for (int i: array)あなたが思っていることをしないかもしれません...

于 2012-10-09T17:44:25.673 に答える