1

7000文字列の配列をアルファベット順にソートするためにクイックソートを機能させようとしていますが、取得しているのは空白の出力ファイルだけです。私のバブルソートメソッドでは問題なく動作しますが、これでは動作しません。明らかな間違いだと思いますが、正確に特定することはできません。

void ArrayStorage::quicksort(int first, int last, string list[])
{
        int middle, p, index;
    string temp, partition;
    if (first < last)
    {  
            middle = int(first + last)/2;
            temp = list[middle];
            list[middle] = list[first];
            list[first] = temp;
            partition = list[first];
            p = first;
            for (index = first + 1; index <= last; index++)
            {
                    if(list[index] < partition)
                    {
                            p = p + 1;
                            temp = list[index];
                            list[index] = list[p];
                            list[p] = temp;
                    }  
            }  
            temp = list[first];
            list[first] = list[p];
            list[p] = temp;
            quicksort(first, p - 1, list);
            quicksort(p + 1, last, list);
    }
}

私はこのようなメソッドを呼び出します:

  quicksort(0,GetSize() -1,namesArray);
4

2 に答える 2

4

組み込みのクイックソートを使用してみませんか?:

std :: sort(&namesArray [0]、&namesArray [GetSize()]);

于 2012-04-26T11:17:12.577 に答える
1

クイックソートの各ループの原則は、一時変数を、それよりも小さいすべての要素が左側に配置され、右側に配置される位置に配置することです。したがって、これは、tempより大きい数値があるかどうかを検索するための右方向の反復と、その逆の両方を含むループである必要があります。ある場合は、現在のコンテンツを反対側に配置し、リストが全体的に繰り返されるまで反対側から繰り返します。ループの後、temp未満のすべての要素は左側にあり、大きい要素は右側にある必要があります。

temp = list[first];
int f = first, l = last;
while (f < l)
{
    while ((f <= l) && (list[l] < temp)) l--;
    if (f <= l)
    {
        list[f] = list[l];
        f++;
    }
    while ((f <= l) && (list[f] > temp)) f++;
    if (f <= l)
    {
        list[l] = list[f];
        l--;
    }
}

このコードは機能するはずです。(このコンピューターにはコンパイラーがありません)機能する場合は、関数自体を再帰的に呼び出してみてください。

さらに、アドバイスがあります。多くの人があなたを勧めているので、自分でデバッグして問題を解決してみてください。

それが役に立てば幸い

于 2012-04-26T11:49:39.000 に答える