0

two を並べ替えるQuickSortの別のバリアントを試していますListBoxes

ここに私のコードがあります:

class cS
{
    public static int[] mQS(int[] iar)
    {
        //divide and conquer
        if (iar.Length < 3)
        {
            if (iar.Length == 2)
            {
                if (iar[0] > iar[1])
                {
                    //wissel
                    int T = iar[1];
                    iar[1] = iar[0];
                    iar[0] = T;
                }
            }
        }
        else
        {
            int size = iar.Length;
            int sum = 0;
            int average = 0;
            for (int i = 0; i < size; i++)
            {
                sum += iar[i];
            }
            average = sum / size; 

            int lk = 1, lg = 1;
            for (int i = 0; i < size; i++)
            {
                if(iar[i]<=average)
                {
                    lk++;
                }
            else
            {
                lg++;
            }
        }

        int[] ak = new int[lk];
        int[] ag = new int[lg];
        lk--; lg--;

        for (int i = 0; i < average; i++)
        {
            if (iar[i] <= average)
            {
                ak[lk]=iar[i];
                lk--; 
            }
            else
            {
                ag[lg] = iar[i];
                lg--;
            }
        }

        if (!Allegelijk(ak)) {ak= mQS(ak);}
        if(!Allegelijk(ag)) {ag = mQS(ag);}
        // plak weer aan elkaar in iar
        for (int i = 0; i < ak.Length; i++)
        {
            iar[i] = ak[i];
        }
        for (int i = 0; i < ag.Length; i++)
        {
            iar[i + ak.Length] = ag[i];
        }
    }
    return iar;
}

private static  bool allEqual(int[] ar)
{
    bool bG = true;
    for (int i = 1; i < ar.Length; i++)
    {
        if (ar[i] != ar[0])
        {
            bG = false;
            break;
        }
     }
     return bG;
 }

}

}

しかし、実行すると次のエラーが発生します。

index out of range exception at the line :

  if (iar[i] <= average>

誰が何が起こっているのか、それを修正する方法を説明できますか?

4

2 に答える 2

1

コメントから:

for (int i = 0; i < average; i++)はすべきではありsizeませんaverage

于 2013-02-01T14:29:38.187 に答える
0

実行中のある時点で、の値がsum十分に大きくなり、にaverage等しいの値が。sum / sizeより大きくなりiar.Lengthます。その結果、iforループのの値は最終的に。以上の値に達しますiar.Length

于 2013-02-01T14:29:03.950 に答える