我认为std::sort
的C ++标准不能保证已经排序的列表上的O(n)性能。但是,我想知道您是否知道STL(GCC,MSVC等)的任何实现是否在执行排序算法之前进行std::is_sorted
检查?
问另一种方式,在排序容器上运行std::sort
时,可以期待什么性能(当然没有保证)?
旁注:我在GCC 4.5上发布了some benchmarks,并在我的博客上启用了C ++ 0x。结果如下:
答案 0 :(得分:27)
实现可以自由使用他们想要的任何有效排序算法,因此这是高度依赖于实现的
但是我看到了libstdc ++在linux和libc ++上使用的性能比较,这是Apple / LLVM开发的新C ++库。这两个库在排序或反向排序的数据上都非常有效(比随机列表快得多),新的库比旧的快得多,并且识别出更多的模式。
确定你应该考虑做自己的基准测试。
答案 1 :(得分:20)
否即可。此外,让is_sorted()
调用任何STL实现是不合逻辑的。因为,is_sorted()
已作为独立版本提供。并且许多用户可能不希望在他们已经知道他们的容器未被分类时不必要地浪费执行周期来调用该函数。
STL也应遵循C ++理念:“按使用付费”。
答案 2 :(得分:11)
哇!你一直在优化吗?
我平台上的代码结果(请注意垂直轴上的值)。
答案 3 :(得分:4)
我建议你阅读this comparison of sorting algorithms,它做得非常好并且信息丰富,它将许多排序算法相互比较,并与GCC的std :: sort实现进行比较。在给定链接的图表中,您会注意到std :: sort对“几乎排序”和“几乎反向”的性能在要排序的元素数量上是线性的,即O(n)。所以,不能保证,但您可以很容易地预期几乎排序的列表将在几乎线性时间内排序。但是,当然,它不执行is_sorted检查,即使它将按线性时间对排序数组进行排序,也不会像执行is_sorted检查和完全跳过排序那样快。您决定在排序之前确定是否更好检查。
答案 4 :(得分:4)
标准仅制裁std::sort
具有复杂度O(n log n)的实现:
复杂性:大约N log N(其中
N == last - first
)平均比较。
参见 25.3.1.1排序[lib.sort] (ISO / IEC 14882:2003(E))。
因此,允许排序功能的集合是有限的,你是对的,它不能保证线性复杂性。
Ideal behavior for a sort is O(n), but this is not possible in the average case.
当然,平均情况不一定是你现在的确切情况,所以对于极端情况,没有太多保证。
答案 5 :(得分:2)
为什么任何实施都会进行检查?会有什么收获? - 平均没什么。一个好的设计规则不是通过对极端情况进行优化来实现混乱,而平均情况没有差别。此示例类似于检查自我分配。一个简单的答案:不要这样做。
答案 6 :(得分:1)
不能保证它会检查这个。有些实现会这样做,有些则可能不会。
但是,如果您怀疑您的输入可能已经排序(或接近排序),std::stable_sort
可能是更好的选择。