0

配列をソートするための次のメソッドを定義しました。

public int[] BubbleSort(int[] ints)
{
    for (int i = 0; i < ints.Length; i++)
    {
        if (ints[i] > ints[i + 1])
        {
            int tempValue = ints[i];
            ints[i] = ints[i + 1];
            ints[i + 1] = tempValue;         
        }
    }
    return ints;               
}

ただし、上記の私の実装は System.IndexOutOfRangeException をスローしています: インデックスは配列の範囲外でした。何が問題なのですか?

4

2 に答える 2

5

.Length - 1代わりに行ってください。また、バブル ソートでは、スワップする要素がなくなるまで配列を反復処理する必要があります (これがバブル ソートを非効率にする原因です)。

public int[] BubbleSort(int[] ints)
{            
    bool swapped = true;
    while (swapped) 
    {
        swapped = false;
        for (int i = 0; i < ints.Length - 1; i++)
        {
            if (ints[i] > ints[i + 1])
            {
                swapped = true;
                int tempValue = ints[i];
                ints[i] = ints[i + 1];
                ints[i + 1] = tempValue;
            }     
        }
    }

    return ints;               
}
于 2012-10-19T00:29:37.067 に答える
1
for (int i = 0; i < ints.Length; i++)
{
  if (ints[i] > ints[i + 1])

の場合i == ints.Length - 1ints[i + 1]配列の末尾を超えた不正なアクセスです。ループ ロジックに off-by-one エラーがあります。

于 2012-10-19T00:26:42.470 に答える