web-dev-qa-db-ja.com

LINQ "OrderBy"ではどのような並べ替えアルゴリズムが使用されますか?

明らかに、LINQの「OrderBy」は元々不安定であると指定されていましたが、Orcaの時点では安定していると指定されていました。すべてのドキュメントがそれに応じて更新されているわけではありません-これらのリンクを検討してください:

ただし、LINQのOrderByが「安定」している場合は、一部のドキュメント(Troyの本など)で使用されていると記載されていても、クイックソート(本質的に不安定)を使用していないことを意味します。だから私の質問は:クイックソートではない場合、LINQのorderByが使用している実際のアルゴリズムは何ですか?

52
Brent Arias

LINQ to Objectsの場合、使用されるのは安定したクイックソートです。他の種類のLINQの場合、基礎となる実装に任されています。

52
Jb Evain

System.Linq.EnumerableSorterに対して開いているリフレクターを起動すると、Linq2Objectsがクイックソートを使用していることがわかります

38
LorenVS

クイックソートが使用されますが、それが安定している理由は、すべてのキーのテストが等しい場合に、要素の各ペアのインデックスが比較されるためです。

つまり、2つの要素の元のインデックスの比較をフォールバックとしてコンパレータ関数に含めることで、クイックソートを安定させることができます。

ソース: http://referencesource.Microsoft.com/#System.Core/System/Linq/Enumerable.cs,1395017e067e5a34

12
Wesner Moise

私は、OrderByがデータベースでソートを実行するSQLに変換されることを理解しています。少なくともLINQtoSQLの場合

3
John Weldon