web-dev-qa-db-ja.com

C ++標準ライブラリのstd :: sort()の時間の複雑さは何ですか?

C++標準ライブラリのstd::sort()の複雑さは何ですか?どの種類が適用されますか?特定の並べ替えアルゴリズムを適用するルールはありますか?

34
Hari Chaudhary

std::sortは、平均ケース線形(n log n)の時間複雑度を持たなければなりません。その時間の複雑さの要件が満たされている限り、任意のアルゴリズムを使用できます。最悪の場合の時間の複雑さの要件はありません。

最悪の場合の時間複雑性関数を保証したい場合は、std::stable_sort、準線形の最悪の場合の時間の複雑さ(n log ^ 2 n)を持ちます。

29
James McNellis

http://en.wikipedia.org/wiki/Sort_(C%2B%2B)

特定のソートアルゴリズムは必須ではなく、実装によって異なる場合があります。たとえば、GNU標準C++ライブラリは、ハイブリッドソートアルゴリズムを使用します。introsortが最初に実行され、2×log2 nで指定された最大の深さまで、nは要素数、結果に対する挿入ソート。[1]実装が何であれ、複雑さは平均してO(n log n)比較である必要があります。

5
Adam Vandenberg

複雑さはO(n log n)です。私の知る限り、いくつかの一般的な実装ではイントロソートを使用しています。

http://en.wikipedia.org/wiki/Introsort

5
Stuart Golodetz

標準保証

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)の比較。ここで、Ndistance(begin(), end())です。

_std::list_についても同じことが言えます:

23.3.5.5/31

複雑さ:およそN log(N)の比較。ここでN == size()です。

ソートアルゴリズム

C++標準では、上記の場合に適用するソートアルゴリズムは指定されていません。これは、しばしば不必要な実装制限になります。

知る必要がある場合は、特定のコンパイラー仕様を調べることができます。たとえば、GNU GCCの場合、 here を開始します。

5
Shoe

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)比較。

1
wkl

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実装で使用されている実際のソートアルゴリズムを把握してください。

0
maxschlepzig