流行的C ++编译器使用什么算法用于std :: sort和std :: stable_sort?

时间:2013-01-27 13:22:48

标签: c++ algorithm sorting compiler-construction computer-science

流行的C ++编译器使用什么算法用于std :: sort和std :: stable_sort?我知道标准只提供了一些性能要求,但我想知道流行实现在实践中使用哪些算法。

如果引用每个实现的参考文献,答案会更有用。

2 个答案:

答案 0 :(得分:19)

首先:编译器不提供 std::sort的任何实现。虽然传统上每个编译器都预先打包了标准库实现(严重依赖于编译器的内置函数),但理论上可以将一个实现交换为另一个实现。一个很好的例子是Clang编译libstdc ++(传统上用gcc打包)和libc ++(全新)。

现在已经不在了......

传统上将

std::sort实现为 intro-sort 。从高级别的角度来看,它意味着一个相对标准的快速排序实现(通过一些中位数探测来避免O(n 2 )最坏的情况)与小输入的插入排序例程相结合。然而,libc ++实现略有不同,更接近TimSort:它检测输入中已经排序的序列,并避免再次对它们进行排序,从而导致完全排序的输入上的O(n)行为。它还使用优化的排序网络进行小输入。

另一方面,

std::stable_sort本质上更复杂。这可以从标准的措辞中推断出来:复杂性是O(n log n)如果可以分配足够的额外内存(提示 merge-sort ) ,但如果没有,则退化为O(n log 2 n)。

答案 1 :(得分:6)

如果我们以gcc为例,我们会看到它是std::sort的内容和std::stable_sort的mergesort。

如果您浏览libc++ code,则会看到如果范围足够大,它还会使用std::stable_sort的mergesort。

您还应该注意的一点是,虽然一般方法总是上述方法之一,但它们都针对各种特殊情况进行了高度优化。