什么是C ++标准库中std :: sort()的时间复杂度?

时间:2010-12-19 20:20:44

标签: c++ stl time-complexity

C ++标准库中std::sort()的复杂性是多少?应用哪种?有没有在那里应用任何特定排序算法的规则?

6 个答案:

答案 0 :(得分:27)

std::sort必须具有平均情况线性(n log n)时间复杂度。只要满足时间复杂度要求,可以使用任何算法。没有最坏情况时间复杂度要求。

如果您想要保证最坏情况时间复杂度函数,请使用std::stable_sort,它具有拟线性最坏情况时间复杂度(n log ^ 2 n)。

答案 1 :(得分:5)

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

  

特定的排序算法不是强制性的,并且可能因实现而异。例如,GNU标准C ++库使用混合排序算法:首先执行introsort,最大深度为2×log2 n,其中n是元素数,然后是结果的插入排序。[1 ]无论实现什么,复杂性应该是平均O(n log n)比较。 [2]

答案 2 :(得分:5)

复杂性为O(n log n)。据我所知,一些常见的实现使用了introsort:

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

答案 3 :(得分:4)

标准保证

从C ++ 11/14标准,std::sort保证:

  

<强>§25.4.1.1/ 3

     

复杂性:O(N log(N))(其中N == last - first)比较。

另一个稳定的标准排序算法(即std::stable_sort)保证具有:

  

<强> 25.4.1.2/3

     

复杂性:最多只有N log2(N)(其中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

答案 4 :(得分:1)

如果您的意思是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效果:对[first,last]范围内的元素进行排序。

     

2复杂性:大约N log N(其中N == last-first)平均比较。

答案 5 :(得分:0)

{{1}的C++ standard specifiesstd::sort()中的worst-case runtime-其中O(n log n)是排序元素的数量(参见C ++ 11,第25.4.1.1)。

该标准未指定特定的排序算法。

因此,符合条件的n实现可以自由选择满足上述运行时要求的任何算法。

请注意,std::sort()中C ++ 11 just required that the average runtime之前的C ++标准修订版在std::sort()中。

另请参阅stackoverflow问题What algorithms are used in C++11 std::sort in different STL implementations?,以了解在实际的STL实现中使用了哪些实际排序算法。