2011-10-02 20 views
7

クイックソートではなくリストをソートする際に、マージオールが「行く方法」と考えられるのはなぜですか? 私はオンラインで見た講義でこれを聞き、いくつかのウェブサイトで見ました。なぜmergesortはリンクリストの方が優れていますか?

+1

これをチェックしてください http://stackoverflow.com/questions/497794/quicksort-slower-than-mergesort –

答えて

17

クイックソートの主な効率源の1つはlocality of referenceです。コンピュータハードウェアが最適化されているため、相互に近いメモリ位置のアクセスがメモリ全体に分散しているメモリ位置へのアクセスより高速になる傾向があります。クイックソートの分割ステップは、前面と背面の近くにある連続する配列要素にアクセスするため、通常は優れたローカリティを備えています。結果として、ヒープソートの場合にはアクセスがより分散されるため、クイックソートは、ヒープソートのような他のソートアルゴリズムよりもはるかに優れている傾向があります。

さらに、クイックソートは、一時的な値を保持する補助配列を作成することなく、インプレースで動作するため、通常、他のソートアルゴリズムよりもはるかに高速です。マージソートのようなものと比べると、補助配列の割り振りと割り当て解除に必要な時間が目に見えることがあるため、これは大きな利点になります。その場で操作することでクイックソートの地域性も向上します。

リンクリストを操作する場合、これらの利点は必ずしも適用されません。リンクされたリストのセルは、しばしばメモリ全体に分散されるため、隣接するリンクされたリストのセルにアクセスするための局所性のボーナスはありません。その結果、クイックソートの大きなパフォーマンス上の利点の1つが食べられます。同様に、マージソートのリンクリストアルゴリズムに余分な補助記憶スペースが必要ないため、インプレースの利点はもはや適用されません。

しかし、quicksortはリンクリストではまだ非常に高速です。マージソートは、リストを半分に均等に分割し、分割ステップを実行するよりもマージを行うための反復ごとの作業が少なくて済むため、高速化する傾向があります。

希望すると便利です。

+0

第3段落の最後の行では、「同様に、マージソートのリンクリストアルゴリズムに余分な補助記憶領域が必要ないため、現場での作業の利点はもはや適用されません。」なぜそれは補助的な貯蔵スペースを必要としないのですか? – Geek

+0

@Geek私はおそらく "マージソートのリンクリストアルゴリズムは必要ありません** O(n)**補助ストレージスペース"と述べているはずです。標準的な配列ベースのマージアルゴリズムでは、要素を移動する必要があるため、マージの過程で余分な記憶領域を割り当てる必要があります。マージソートでリンクされたリストを使用すると、単純に再リンクするだけで外部配列を割り当てずに要素を移動することができます。 – templatetypedef

1

find()のコストは、mergesortよりもquicksortにとってより有害です。

マージソートは、データに対してより多くの「短距離」操作を実行するため、リンクリストに適していますが、クイックソートはランダムアクセスデータ構造でより効果的です。

+0

'find()'とはどういう意味ですか? – templatetypedef

+0

データ構造内のエントリを検索します。リンクされたlinstの場合は、テープの再生のように、常に前進/巻き戻しが行われます。 –

+0

リンクリストのケースでクイックソート用の配列に使用されるランダムアクセスパーティション関数を使用する必要はありません。リスト全体を反復し、各要素を3つのリスト(「より小さい」リスト、「より大きい」リスト、および「等しいリスト」のいずれか)に分配してリンクされたリストを分割し、後の2つで再帰させることができます。あなたは標準パーティションが遅いのは間違いありませんが、それはリンクリストのクイックソートを本質的に遅くするものではありません。 – templatetypedef

関連する問題