【问题标题】:Sorting potentially already sorted sequence -- stl::sort efficiecny [duplicate]对可能已经排序的序列进行排序——stl::sort efficiecny [重复]
【发布时间】:2015-03-11 11:04:24
【问题描述】:

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

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

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

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

感谢您的回答。

【问题讨论】:

  • 测试一个数组是否排序和实际排序是一回事,我会想到的?
  • @JonathanPotter 嗯,你可以测试一个数组是否在 O(n) 中排序,但你只能在 O(n log n) 中排序(使用元素比较)。
  • @JonathanPotter:对于冒泡排序,是的! :-)

标签: c++ stl


【解决方案1】:

不能保证一定会为您完成,因此请大家尝试并进行基准测试,看看它是否有用。 std::is_sorted 可用于促进此测试。

【讨论】:

    【解决方案2】:

    在复杂性方面我不是最好的,但排序是 O(nlogn),而测试是 O(n),因为每次测试当前元素与前一个元素时,您都会遍历向量一次。

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

    【讨论】:

      【解决方案3】:

      如果您真的在询问STL,您可以查看它的实现并查看它使用的排序算法。有些排序算法可以利用已排序的序列(冒泡排序),有些则不能(快速排序,取决于枢轴选择)。

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

      所以没有明确的答案。您绝对应该在事先检查和不检查的情况下进行测量,并根据这些测量结果做出决定。

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 2013-09-29
        • 2014-05-07
        相关资源
        最近更新 更多