C ++中的quicksort很慢

时间:2009-07-30 19:25:33

标签: c++ sorting quicksort

我有一个矩阵形式的9个值,需要根据这些值计算中值作为模拟过程的一部分。

我在C ++中使用quicksort(即qsort()),这导致进程运行缓慢(因为此进程迭代了几次)。

我可以使用更好的排序算法吗?

8 个答案:

答案 0 :(得分:19)

排序以获得中位数效率非常低。您可以改为使用STL nth_element:

#include <algorithm>

// Assuming you keep the elements in a vector v of size len

std::nth_element( v.begin(), v.begin()+len/2, v.end() );
median = v[len/2];

 //... or, if the elements are in a simple array v[len], then

std::nth_element( v, v+len/2, v+len );
median = v[len/2];

注意:nth_element将修改vector / array v。如果需要保留原始文件,请先复制一份。

答案 1 :(得分:9)

请不要向masochists推荐泡泡分类!

对于小值,插入排序是最好的,它对其他应用程序(几乎任意长度的排序数据)都有好处。

编辑:清理格式,强调建议的答案。

答案 2 :(得分:5)

只有9个值? Quicksort太过分了。

在处理较小的数据集时,也许使用插入排序,冒泡排序或其他更简单的排序算法。

<强>性能

冒泡排序具有最坏情况和平均复杂度О(n²),其中n是被排序的项目数。存在许多排序算法,其具有明显更好的O(n log n)的最坏情况或平均复杂度。即使是其他О(n²)排序算法,例如插入排序,也往往比冒泡排序具有更好的性能。因此,当n很大时,冒泡排序不是一种实用的排序算法。

但是,如果获得批准,你甚至不必像其他人所建议的那样排序获得中位数。

答案 3 :(得分:4)

  1. 正如所提到的那样,没有必要完全排序以获得中位数。

  2. STL具有 sort 算法,通常可以执行比较内联。它还具有比qsort保证更智能的算法,其中最坏情况为O(NlgN)。

答案 4 :(得分:4)

仅使用9个值的快速排序效率相当低。对于如此小的样本量,使用选择排序或替换排序会更好......这些排序方法的开销很小。

一旦你的样本量达到一个阈值,可能是50+,Quicksort和Mergesort真的会闪耀。

在这些情况下,我会编写自己的代码,而不是使用内置函数。

答案 5 :(得分:4)

std :: sort()算法几乎总是优于qsort()。它通常更容易使用,运行速度更快。

如果您想详细介绍,实际上有一系列排序算法。 Stroustrup在 C ++编程语言中写道,std :: sort通常不是正确使用的东西。在这种情况下,std :: nth_element()可能就是你想要的。

答案 6 :(得分:2)

您没有足够的值来使用Quicksort,您应该使用不太高级的算法(例如:冒泡排序,插入排序,...... explanation here

Quicksort的设置需要相关费用,当你没有足够的价值时,使用这个野兽是没用的。

答案 7 :(得分:1)

插入排序..

在小型数据集上,您可以使用不同的算法来获得最佳性能。一旦数据集增长,QuickSort就会闪耀。

有不同的方法。您可以使用在插入时排序的数据结构,并且您可以对完整数据集进行排序。您只需找到最佳算法即可。