C++標準ライブラリのstd::sort()
の複雑さは何ですか?どの種類が適用されますか?特定の並べ替えアルゴリズムを適用するルールはありますか?
std::sort
は、平均ケース線形(n log n)の時間複雑度を持たなければなりません。その時間の複雑さの要件が満たされている限り、任意のアルゴリズムを使用できます。最悪の場合の時間の複雑さの要件はありません。
最悪の場合の時間複雑性関数を保証したい場合は、std::stable_sort
、準線形の最悪の場合の時間の複雑さ(n log ^ 2 n)を持ちます。
http://en.wikipedia.org/wiki/Sort_(C%2B%2B)
特定のソートアルゴリズムは必須ではなく、実装によって異なる場合があります。たとえば、GNU標準C++ライブラリは、ハイブリッドソートアルゴリズムを使用します。introsortが最初に実行され、2×log2 nで指定された最大の深さまで、nは要素数、結果に対する挿入ソート。[1]実装が何であれ、複雑さは平均してO(n log n)比較である必要があります。
複雑さはO(n log n)
です。私の知る限り、いくつかの一般的な実装ではイントロソートを使用しています。
C++ 11/14標準から、_std::sort
_には以下が保証されています。
§25.4.1.1/ 3
複雑さ:
O(N log(N))
(where _N == last - first
_)比較。
もう1つの安定した標準のソートアルゴリズム(つまり_std::stable_sort
_)には以下が保証されています。
25.4.1.2/3
複雑さ:最大で
N log2(N)
(where _N == last - first
_)比較します;十分な追加メモリが利用可能な場合、N log(N)
です。
_std::forward_list::stable
_の場合、代わりに:
23.3.4.6/26
複雑さ:およそ
N log(N)
の比較。ここで、N
はdistance(begin(), end())
です。
_std::list
_についても同じことが言えます:
23.3.5.5/31
複雑さ:およそ
N log(N)
の比較。ここでN == size()
です。
C++標準では、上記の場合に適用するソートアルゴリズムは指定されていません。これは、しばしば不必要な実装制限になります。
知る必要がある場合は、特定のコンパイラー仕様を調べることができます。たとえば、GNU GCCの場合、 here を開始します。
std::sort()
を意味する場合:
これは、C++ 03標準のセクション25.3からのものです。パフォーマンス保証:
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare> void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
1効果:範囲[最初、最後]の要素を並べ替えます。
2複雑さ:平均で約N log N(N == last-first)比較。
C++標準仕様std::sort()
の 最悪の場合のランタイム がO(n log n)
にあること-n
はソートされた要素の数です(C++ 11、セクション25.4.1.1)。
標準では、特定の並べ替えアルゴリズムは指定されていません。
したがって、準拠するstd::sort()
実装では、上記のランタイム要件を満たすアルゴリズムを自由に選択できます。
C++ 11以前のC++標準リビジョン std::sort()
のaverageランタイム がO(n log n)
にあることが必要でした。
Stackoverflowの質問も参照してください 異なるSTL実装でC++ 11 std :: sortで使用されているアルゴリズムは何ですか? 実際のSTL実装で使用されている実際のソートアルゴリズムを把握してください。