C ++标准库中std::sort()
的复杂性是多少?应用哪种?有没有在那里应用任何特定排序算法的规则?
答案 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:
答案 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)
次比较,其中N
为distance(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 specifies在std::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实现中使用了哪些实际排序算法。