ランダムな整数のリストがあります。どのアルゴリズムがlist::sort()
メソッドで使用されているのかと思います。例えば。次のコードで:
list<int> mylist;
// ..insert a million values
mylist.sort();
編集:参照 このより具体的な質問 。
標準は特定のアルゴリズムを必要とせず、安定している必要があり、約N lg Nの比較を使用して並べ替えを完了する必要があるだけです。これにより、たとえば、クイックソートのマージソートまたはリンクリストバージョンが可能になります(一般的な考えに反して、クイックソートは必要ありません必要ありません配列の最も一般的な実装は)ですが、不安定です。
その条件付きで、短い答えは、最新の標準ライブラリではstd::sort
は、基本的には再帰の深さを追跡するQuicksortであるイントロソート(イントロスペクティブソート)として実装され、Quicksortが通常であればHeapsort(通常は低速ですがO(n log n)の複雑さ)に切り替わります。再帰が深すぎます。ただし、イントロソートは比較的最近(1990年代後半)発明されました。古い標準ライブラリは通常、代わりにクイックソートを使用していました。
stable_sort
が存在するのは、配列のようなコンテナーをソートする場合、最速のソートアルゴリズムのほとんどが不安定であるため、標準には両方のstd::sort
(高速ですが、必ずしも安定しているとは限りません)およびstd::stable_sort
(安定していますが、多くの場合多少遅くなります)。
ただし、どちらも通常はランダムアクセス反復子を想定しており、リンクリストのようなものでは(もしあれば)うまく機能しません。リンクリストの適切なパフォーマンスを得るために、標準にはlist::sort
。ただし、リンクされたリストの場合、そのようなトレードオフは実際にはありません-安定との両方であるマージソートを実装するのは非常に簡単です(約)何よりも速い。そのため、安定するために必要なsort
メンバー関数が1つだけ必要でした。
それは完全に定義された実装です。規格がそれについて言っている唯一のことは、その複雑さはO(n lg n)であり、ソートはstableであることです。つまり、等しい要素の相対的な順序は、ソート後に変更されないことが保証されています。
std::list
のソートメンバー関数は、通常、何らかの形式のマージソートを使用して実装されます。これは、マージソートが安定しており、リンクリストを使用している場合のマージは非常に安価です。
それが役に立てば幸い:)