1

クラスのクイックソート関数を実装しています。彼女がクラスで擬似コードを使って教えてくれたのと同じ方法でそれを行わなければなりません。さもないと、クレジットを取得できません。

「変数'quickArray'の周りのスタックが破損しました」というランタイムエラーが発生します

デバッガーで遊んだのですが、それでも問題が何なのかわかりません。私はそれが私のPartition()関数と関係があると思っていますが、よくわかりません。誰か助けてもらえますか?Ivは、main()、QuickSort()、およびPartition()関数を以下に投稿しました。

int main()
{


int quickArray[10] = { 5 ,99, 32, 4, 1, 12, 15 , 8, 13, 55};
int P = quickArray[0];
int R =quickArray[9];

QuickSort(quickArray,P,R);
return 0;

}

.................................................。 .........................................。

void QuickSort(int ar2[],int P, int R)
{
int Q;

if( P < R )
{
    Q =  Partition(ar2,P,R);
    QuickSort(ar2,P,Q-1);
    QuickSort(ar2,Q+1,R);
}

}

.................................................。 ........................................。

int Partition(int ar2[],int P, int R)
{
int x = ar2[R];
int i = P-1;
int temp;

for(int j = P; j <= R-1; j++)
{
    if( ar2[j] < x  )
    {
        i = i +1;
        temp = ar2[i];
        ar2[i] = ar2[j];
        ar2[j] = temp;
    }

    temp = ar2[R];
    ar2[R] = ar2[i+1];
    ar2[i+1] = temp;
}

return (i+1);
}
4

3 に答える 3

2

QuickSort関数に間違ったインデックスを渡しています:

int P = quickArray[0];
int R =quickArray[9];

PとRは配列インデックスであり、この場合は0と9である必要がありますが、最初の要素と最後の要素をインデックスとしてQuickSortに渡していたため、55(quickArray [9])はquickArrayのインデックス範囲外であるため、次のようになります。エラー。

ところで:説明的な変数名を使用することをお勧めします。この場合、PとRはそれらが何を意味するかをうまく表現していません。QuickSortアルゴリズムで説明されているように、左、右、およびピボットを使用して、それぞれR、R、およびQを置き換えることができます。

于 2013-03-17T01:39:31.807 に答える
2

インデックスではなく配列の実際の要素を渡しています。これをデバッグする簡単な方法は、次coutQuickSortようになります。

void QuickSort(int ar2[],int P, int R)
{
   std::cout << "P: " << P << " R: " << R << std::endl ;
   ...

また、呼び出しのcout後:Partition

  Q =  Partition(ar2,P,R);

  std::cout << "QS: Q= " << Q << std::endl ;

修正は、次のように呼び出すQuickSortことmainです。

 QuickSort(quickArray,0,9);

長期的にデバッガーを使用すると、これらのバグをより迅速に発見するのに役立ちます。

于 2013-03-17T01:42:16.340 に答える
0

これ

int P = quickArray[0];
int R = quickArray[9];

QuickSort(quickArray,P,R);

これでなければなりません:

int arrStartIndex = 0;
int arrEndIndex   = 9;

QuickSort(quickArray, arrStartIndex , arrEndIndex);

他の人が指摘したように、コードではよりわかりやすい名前を使用する必要があります。

于 2013-03-17T01:41:53.210 に答える