Har*_*ary 34 c++ stl time-complexity
std::sort()
C++标准库的复杂性是什么?应用哪种?有没有在那里应用任何特定排序算法的规则?
Jam*_*lis 29
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)比较.[2]
复杂性是O(n log n)
.据我所知,一些常见的实现使用introsort:
http://en.wikipedia.org/wiki/Introsort
根据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)
(whereN == 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,您将从此处开始。
归档时间: |
|
查看次数: |
41324 次 |
最近记录: |