排序可能已排序的序列 - stl :: sort效率

时间:2015-03-11 11:04:24

标签: c++ stl

我需要对一个stl :: vector进行排序,我知道它已经很有可能已经排序了。

我想知道我是否应该这样做:

void my_sort(vector& v){
    if( is_not_sorted(v) ) std::sort(v.begin(),v.end());
}

或者如果这已经在std :: sort中为我完成了(这将意味着对不太可能已经排序的向量的性能更差)。

感谢您的回答。

3 个答案:

答案 0 :(得分:2)

不能保证为您完成,所以请所有人尝试并进行基准测试以确定它是否有用。 std::is_sorted可用于促进此测试。

答案 1 :(得分:0)

在复杂性方面,我不是最好的,但排序是O(nlogn),而测试是O(n),因为每次使用前一个元素对当前元素进行测试时,迭代遍历向量。

我会说它不值得测试,除非你有一个非常大的向量,并且你做了类似于sorted_flag = true的事情,一旦你发现第一个元素乱序,你就会求助于排序。

答案 2 :(得分:0)

如果你真的在询问STL,你可以查看它的实现,看看它使用了什么排序算法。一些排序算法可以利用已经排序的序列(bubblesort),有些不能(快速排序,取决于枢轴选择)。

但是,我怀疑你实际上是在询问C ++标准库而不是STL。在这种情况下,它取决于您的标准库的实现。如果序列已经排序,则标准本身不要求任何特定行为。我相信std::sort的大多数常见标准库实现都基于introsort。由于这是基于quicksort,我认为它能够利用“已经排序”取决于枢轴选择 - 再次是标准库的实现细节。

所以没有明确的答案。你应该用先前的检查和没有它来测量,并根据这些测量结果进行测量。