我有一个矩阵形式的9个值,需要根据这些值计算中值作为模拟过程的一部分。
我在C ++中使用quicksort(即qsort()),这导致进程运行缓慢(因为此进程迭代了几次)。
我可以使用更好的排序算法吗?
答案 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)
正如所提到的那样,没有必要完全排序以获得中位数。
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就会闪耀。
有不同的方法。您可以使用在插入时排序的数据结构,并且您可以对完整数据集进行排序。您只需找到最佳算法即可。