0

そのため、配列を再配置する方法に関する 5 つまたは 6 つの投稿を読みました。アルファベット順、数字順、およびその章も読みました。最終的に思いついたのがこれ、

void selectionSort (string array[], int size)
{
int startScan, minIndex;
string minValue;
for(startScan = 0; startScan<(size-1); startScan++)
{
    minIndex = startScan;
    minValue = array[startScan];
    string temp;
    for(int index = startScan+1; index<size; index++)
    if(array[index] <minValue)
    {
        minValue = array[index];
        minIndex = index;
    }
}
array[minIndex] = array[startScan];
array[startScan] = minValue;
system("pause");
}

明らかに、これは機能しません。実行すると壊れる必要があると叫びます。int または数値型のいずれかであれば、これでうまくいくと思います。ええと、char 型の ASCII 値として設定した場合でも、おそらく実行されるでしょう。しかし、実際の割り当ては文字列であり、私にはそれがわかりません。最初の文字を切り取って char に変換し、そのようにアルファベットに変換しようと考えましたが、一部の文字列には姓が同じで名前が異なるため、それも機能しません。

並べ替えで配列をアルファベット順に並べ替えるには、何を修正する必要がありますか?

更新コメントを読んで本を読み直した後、コードで変更したものを更新しました。コードを実行してもエラーは発生しなくなりましたが、それでもソートされません!

4

3 に答える 3

1

まず、配列の最後に到達すると、範囲外のインデックス例外が発生します。count+1 にアクセスしているため、 for ループは size-1 で停止する必要があります。これはバブル ソートの始まりのように見えますが、不完全に実装されています。バブルソートについて少し調べてみると、すぐに答えが得られるはずです。

于 2013-04-05T12:00:47.323 に答える
1

したがって、何らかの理由で std を使用しないことを選択します (スワップとソートの両方があります)。

次の点にご注意ください。

  temp = array[count];
    array[count]=array[(count+1)]; <-- when count is exactly size -1 you are going to commit overflow to your array
    array[(count+1)] = temp;

インデックスが配列の境界を超えていないことを確認する必要があります..:

for(int count = 0; count<size -1 ; count++)

(ちなみに、std::swapを見てください。使用する方が良いかもしれません)

于 2013-04-05T11:58:32.077 に答える
1

あなたがするarray[count + 1]とき(ときcount == size - 1)、明らかな範囲外の問題があります。そして、コードがどのようにソートされるのかわかりません。どのアルゴリズムを使用しようとしていますか?

于 2013-04-05T11:58:44.240 に答える