排序可能已经排序的序列 -- stl::sort efficiecny
Sorting potentially already sorted sequence -- stl::sort efficiecny
我需要对一个stl::vector进行排序,我知道它很有可能已经被排序了。
我想知道我是否应该做这样的事情:
void my_sort(vector& v){
if( is_not_sorted(v) ) std::sort(v.begin(),v.end());
}
或者,如果这已经在 std::sort 中为我完成了(这意味着在不太可能已经排序的向量上性能更差)。
感谢您的回答。
C++ 标准不会要求std::sort
实现检查已经排序的输入,因此请务必添加它并进行基准测试以查看它是否对您有用。 最有效的方法可能取决于数据大小、元素数量、CPU 缓存大小和相对速度、<
比较的性能、预排序的概率等。
由于在从未或很少发生的情况下检查输入是否预先排序是次优的,因此,当有用时,您可以简单地组合它std::sort
和std::is_sorted
实际上是可取的。
在复杂性方面,我不是最好的,但排序是 O(nlogn),而测试是 O(n),因为每次测试当前元素时,您都会遍历一次向量。
我会说它不值得测试,除非你有一个非常大的向量并且你做了一些事情,比如有一个 sorted_flag=true,一旦你发现第一个元素顺序不正常,你就会求助于排序。
如果你真的在问STL,你可以看看它的实现,看看它使用什么排序算法。一些排序算法可以利用已经排序的序列(冒泡排序),有些则不能(快速排序,取决于枢轴选择)。
但是,我怀疑您实际上是在询问C++标准库而不是 STL。在这种情况下,这取决于标准库的实现。如果序列已经排序,标准本身并不要求任何特定行为。我相信std::sort
最常见的标准库实现都是基于introsort的。由于这是基于快速排序的,因此我认为它利用"已排序"的能力取决于透视选择——这又是标准库的实现细节。
所以没有明确的答案。您绝对应该进行测量,无论是事先检查还是没有检查,并根据这些测量进行测量。
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 排序可能已经排序的序列 -- stl::sort efficiecny