【发布时间】: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 的每个递归调用构建随机数生成器肯定非常昂贵。
-
我注意到您为每个分区初始化了一个新的随机生成器。你只需要一个发行版。呸,太慢了。 :)