std :: sort检查一个向量是否已经sorting?
我相信std::sort
的C ++标准不能保证已经sorting的列表上的O(n)性能。 但是,我仍然想知道在执行sortingalgorithm之前,是否对STL(GCC,MSVC等)的任何实现进行std::is_sorted
检查?
问另一种方式,什么样的性能可以期望(当然没有保证)在一个已sorting的容器上运行std::sort
?
注意:我在博客上发布了 C ++ 0x的GCC 4.5的一些基准testing 。 结果如下:
实现可以自由使用他们想要的任何有效的sortingalgorithm,所以这是非常依赖于实现的
但是我已经看到了linux上使用的libstdc ++和libc ++ Apple / LLVM开发的新的C ++库的性能比较。 这两个库在sorting或反向sorting的数据上都非常高效(随机列表上的速度要快得多),而新库比老版本更快,可以识别更多的模式。
要确定你应该考虑做自己的基准。
没有 。 另外,为任何STL实现调用is_sorted()
是is_sorted()
。 因为, is_sorted()
已经可以作为一个独立的。 许多用户可能不想浪费执行周期,因为他们已经知道他们的容器没有被sorting,所以调用这个函数是不必要的。
STL也应该遵循C ++的理念:“ 按使用付费 ”。
哇! 你有没有优化一路摇摆?
您的代码在我的平台上的结果(请注意垂直轴上的值)。
我build议你阅读这个sortingalgorithm的比较 ,它做得非常好,信息丰富,它比较了一些sortingalgorithm相互和GCC的std :: sort的实现。 你会注意到,在给定的链接的图表中,std :: sort对“几乎sorting”和“几乎相反”的性能在sorting的元素数量上是线性的,即O(n)。 所以,没有保证,但是你可以很容易的预料,一个几乎sorting的列表将会几乎是线性时间sorting的。 但是,当然,它不会执行is_sorted检查,即使它将在线性时间对sorting后的数组进行sorting,也不会像执行is_sorted检查一样快并且完全跳过sorting。 决定是否在sorting之前检查是否更好。
标准制裁只有std::sort
复杂度为O(n log n)的实现:
复杂性:平均大约N log N(其中
N == last - first
)比较。
请参见第25.3.1.1节“ sorting[lib.sort]” (ISO / IEC 14882:2003(E))。
因此,允许的sorting函数的集合是有限的,而且你不错,它不能保证线性的复杂性。
理想的行为是O(n),但在一般情况下这是不可能的。
当然,平均情况并不一定是你现在的确切情况,所以对于angular落案件来说,没有太多的保证。
那为什么会有这样的检查? 它会得到什么? – 没有什么平均。 一个好的devise规则并不是对平均情况没有影响的angular落案例进行优化。 这个例子类似于检查自我分配。 一个简单的答案:不要这样做。
不能保证它会检查这个。 有些实现可以做到,其他的可能不会。
但是,如果您怀疑您的input可能已经sorting(或接近sorting),则std::stable_sort
可能是更好的select。