我需要对一个stl :: vector进行排序,我知道它已经很有可能已经排序了。
我想知道我是否应该这样做:
void my_sort(vector& v){
if( is_not_sorted(v) ) std::sort(v.begin(),v.end());
}
或者如果这已经在std :: sort中为我完成了(这将意味着对不太可能已经排序的向量的性能更差)。
感谢您的回答。
答案 0 :(得分:2)
不能保证为您完成,所以请所有人尝试并进行基准测试以确定它是否有用。 std::is_sorted
可用于促进此测试。
答案 1 :(得分:0)
在复杂性方面,我不是最好的,但排序是O(nlogn),而测试是O(n),因为每次使用前一个元素对当前元素进行测试时,迭代遍历向量。
我会说它不值得测试,除非你有一个非常大的向量,并且你做了类似于sorted_flag = true的事情,一旦你发现第一个元素乱序,你就会求助于排序。
答案 2 :(得分:0)
如果你真的在询问STL,你可以查看它的实现,看看它使用了什么排序算法。一些排序算法可以利用已经排序的序列(bubblesort),有些不能(快速排序,取决于枢轴选择)。
但是,我怀疑你实际上是在询问C ++标准库而不是STL。在这种情况下,它取决于您的标准库的实现。如果序列已经排序,则标准本身不要求任何特定行为。我相信std::sort
的大多数常见标准库实现都基于introsort。由于这是基于quicksort,我认为它能够利用“已经排序”取决于枢轴选择 - 再次是标准库的实现细节。
所以没有明确的答案。你应该用先前的检查和没有它来测量,并根据这些测量结果进行测量。