【问题标题】:QuickSort is slower than std::sortQuickSort 比 std::sort 慢
【发布时间】:2015-10-15 19:33:30
【问题描述】:

我有一个如下所示的 quick_sort 代码 (С++)

template< typename BidirectionalIterator, typename Compare >
BidirectionalIterator quick_sort_partition( BidirectionalIterator left, BidirectionalIterator right, Compare cmp ) {
    BidirectionalIterator q = left - 1;
    std::mt19937 gen(time(0)); 
    std::uniform_int_distribution<int> uid(0, right - left - 1);
    int pivot_1 = uid(gen) ;
    BidirectionalIterator randomNum = pivot_1 + left;
    std::iter_swap( randomNum, right );
    bool index = 0;
    for (BidirectionalIterator i = left; i < right; i++){
        if (*i < *right){
            ++q;
            std::iter_swap( q, i );
        }
        if (*i == *right){   
            index = 1 - index;
            if(index){
                ++q;
                std::iter_swap( q, i );
            }
        }
    }

    ++q;
    std::iter_swap( q, right );


    return q;

}
template< typename BidirectionalIterator, typename Compare >
void quick_sort( BidirectionalIterator first, BidirectionalIterator last, Compare cmp ) {
    if (first < last){
        BidirectionalIterator q = quick_sort_partition(first, last, cmp);
        quick_sort(first, q - 1, cmp);
        quick_sort(q + 1, last, cmp);
    }
}

但在大型测试中他比 std::sort 慢(超过 6 倍)。

有什么想法吗?

如何优化我的代码以做好工作?

【问题讨论】:

  • 为什么不看一下中的代码,看看有什么区别?
  • 因为写sortnew 的人会被大量受众使用并尽可能提高效率?
  • 只是一个疯狂的猜测:std::sort 是由一群非常有经验的程序员编写的,并且经过多年的改进和手动优化以提高速度。
  • 为 quick_sort 的每个递归调用构建随机数生成器肯定非常昂贵。
  • 我注意到您为每个分区初始化了一个新的随机生成器。你只需要一个发行版。呸,太慢了。 :)

标签: c++ sorting quicksort


【解决方案1】:

您的 QuickSort 实现非常简单。它确实使用随机枢轴选择,确保没有导致性能下降的“杀手”输入,因此这比绝对基本的快速排序要好。

可能会使用许多优化,其中包括:

  • “快速排序”实际上是作为混合排序实现的,对于小于某个固定阈值的分区,它通常会回退到(比如说)插入排序。一旦到达小分区,快速排序的开销往往会克服其渐近复杂性的优势。

  • 可以通过切换到混合递归/迭代方法来最小化最大递归深度并减少函数调用开销,其中在每次分区时,对较小的子数组进行递归排序,但代码只是循环排序较大的那个。

  • 分区时,您可以通过查找交换将 both 放入正确子分区的元素对并交换它们,而不是在交换到一个子分区并交换到另一个。

  • 想出一种在整个排序过程中重复使用相同随机数源的方法可能会有所帮助,而不是在每次分区时都实例化一个新的随机数源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2023-03-31
    • 2017-12-13
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多