2012-04-23 6 views
2

可能性の重複:
Stabilizing the standard library qsort?比較を変更するだけでqsortが安定しますか?

それはちょうど私のコンプOPを変更することで、int型のためのqsort安定させることは可能ですか?それが私のコードです。私はこれを約5-7サイズの非常に小さな配列に使用しています。

static int compare(const void *a, const void *b) 
{ 
    const int A(*(const int*)(a)); 
    const int B(*(const int*)(b)); 

    return B - A; 
} 
+1

あなたの 'int'sが"合理的な "サイズで、オーバーフローが起こらない場合 - はい。 – valdo

+0

@valdo:質問を理解してもよろしいですか? C標準ライブラリ関数qsort()は安定したソートだと思いますか?それについてはどんな参考文献もありますか? –

+10

あなたのデータが単なる整数である場合、ソートアルゴリズムが安定しているのはなぜですか?安定性は、等価として比較できる識別可能な要素がある場合にのみ重要です。 –

答えて

3

C++を使用している場合、stable_sort関数は安定しており、O(nlogn)のパフォーマンスを持ちます。

それ以外の場合、インプレースクイックソートはその性質上、不安定です(私はそう信じています)。しかし、情報を格納するために余分な配列を使用する簡単な方法は安定しています。

かつて私は、私のマシン上の入力の場合についてqsort()stable_sort()によって生成される結果が異なっていたことがわかったので、私は、不安定であるqsort()の少なくとも一つのバージョンを使用しました。

2

クイックソートなどの不安定なソートアルゴリズムを使用して比較演算子を変更するだけで安定させることはできません。安定したソートアルゴリズムを持つ開始を持っていなければなりません。そして、比較は重要ではありません(C++で厳密な弱い順序がある限り)。

+3

元の要素へのポインタの配列を構築し、代わりにポインタの配列を並べ替えることで、不安定なソートの上に安定したソートを構築することができます。 –