2017-03-25 16 views
-3

このコードがArrayIndexOutOfBoundsExceptionをなぜ与えているのか理解できませんでした。ここでは は双方向バブルソートを実装するコードです。なぜ双方向バブルソートのArrayIndexOutOFBoundExceptionですか?

static void bubble(int[] a){ 
    int temp; 
    for(int i=a.length-1,k=0;i!=k;i--,k++){ 
     for(int j=k;j<i;j++){ 
      if(a[j]>a[j+1]){ 
      temp=a[j]; 
      a[j]=a[j+1]; 
      a[j+1]=temp; 
      } 
     } 
     for(int j=i-1;j>k;j--){ 
      if(a[j-1]>a[j]){ 
      temp=a[j]; 
      a[j]=a[j-1]; 
      a[j-1]=temp; 
      } 
     } 
    } 
} 
+2

IDEに組み込まれているデバッガのコードをステップ実行します。 'i'、' k'、 'j'を監視します。特に、' a'にアクセスするために使用されます(そして、あなたが時々使用している '+ 1'と' -1'を許可します)。あなたはバグを見つけるでしょう。 –

+0

@Shreya IDEを使用してブレークポイントを挿入し、コードの進捗状況を監視してみてください。存在しない索引にアクセスするシナリオを見ることができるはずです。 – kkaosninja

+0

コードをデバッグします。しかし、私が見るように、 'a.length'が偶数であれば' i'は不均一ですが 'k'は偶数であるので、' i == k'という状況は決して受けられません。 –

答えて

2

は、私はそれがあるため、その行であると思う:

for(int i=a.length-1,k=0;i!=k;i--,k++) 

あなたincremnt Kとデクリメント私が、あなただけの!=をチェックします。しかし、その都度の違いは2であるので、必ず!=を取得する必要はありません。 >ことによってそれを置き換えるために試してみてください。そして、私= 3、K = 0〜4である

for(int i=a.length-1,k=0;i>k;i--,k++){ 
+0

はいそれは今働いている!!あなたの助けてくれてありがとう... –

+0

私の答えを解決策としてマークしてください。 – Markus

1

a.length場合。

次の繰り返しでは、i = 2、k = 1です。

次:I = 2

= 1、K

次:I = 0、K = 3、J = K、[J + 1] - >は、ArrayIndexOutOfBoundsException

0

あなたの外側をチェックすることがないため境界:

for(int i=a.length-1,k=0;i!=k;i--,k++){ 

何らかの理由ikと等しくなることはありません場合は、あなたのforサイクルがi == -1k == a.lengthに到達します。奇数の要素がある場合、ikが中央値に達すると、forは停止します。しかし、要素の数がペアの場合はどうなりますか? 10のように? iが5に達し、kが4に達すると、kが5に増加し、iが4に減少します。 i!=kの場合は、代わりにi >= kを確認する必要があります。

+0

ありがとうございました.... –

+0

@shreyajainこれがあなたの質問に答えるならば、正しい答えとしてそれを受け入れることができます。 –