在C ++中对包含多个double类型的数组进行排序的最快方法是什么?

时间:2013-03-17 15:40:26

标签: c++ sorting

在C ++中对包含多个double类型的数组进行排序的最快方法是什么?我有两种类型的数组,第一个长度为20,第二个长度为5000,数组的长度是否与哪些算法最快?长度为5000的数组平均包含28个不同的值。

http://www.codeproject.com/Articles/38381/STL-Sort-Comparison-Function

3 个答案:

答案 0 :(得分:2)

对于第一个问题:如果你的数组只有一小组唯一值(如你所说的28),你可能需要考虑某种计数排序(味道:基数,鸽子,桶)。如果你知道阵列内容的硬限制和范围,你可以做一些好事。

但是如前所述,对于这样的小数组,你可能对std :: sort很好,除非你有很多5000元素数组要排序。

关于第二个问题:长度问题(见天空答案)。 O(n log n)是任何正常排序都可以做到的最好的。 O(n ^ 2)通常是最坏的情况。 O(n ^ 2)意味着在最坏的情况下,您的20个元素阵列需要时间对应于20 ^ 2(= 400)个操作,并且您的5000个阵列时间对应于5000 ^ 2(= 25百万)个操作。如您所见,在这种情况下,更大的阵列意味着更多的时间。对于您的情况和O(n log n)算法,5000阵列需要时间对应于5000 log 5000(= 18500)运算。

操作是什么以及需要多长时间取决于特定的实现,并且通常与比较无关(因此用Ordo表示法忽略)。当阵列大小足够大时,O(n log n)算法的慢速实现仍然比O(n ^ 2)算法的快速实现更快。但对于像20个元素这样的小型数组,一个好的低开销实现最重要。 400次快速操作将比26次慢速操作快。 5000阵列的相同比较表明,2500万次快速操作仍然不会比18500次慢速操作快。

另一个因素是数组的内容。一些算法,如插入排序,在几乎正确顺序的数组上特别快(接近O(n)),而随机输入上的O(n ^ 2)差。

通过利用阵列内容的预定义(已知)限制/范围(因此不归类为正常排序),计数排序可以接近O(n),也就是说,时间与元素的数量成正比。见维基百科。

快乐的研究!

答案 1 :(得分:1)

我有所作为,但最好的办法是使用std :: sort。它在内部根据输入大小在内部切换被认为最佳的排序算法。

参见维基百科参考资料:

答案 2 :(得分:1)

您可能希望搜索排序算法,如Quicksort,合并排序,插入排序或冒泡排序。

排序在很大程度上取决于要排序的项目数量,从排序算法的表示法可以看出,“大O表示法”。不同值和数据类型的平均数量通常不会在运行时产生足够的差异。 O(n^2)(冒泡排序)的算法具有您所拥有的元素数量的平方的复杂性,告诉您它的时间在要排序的项目数方面大致呈二次方式增加。 Quicksort具有O(n log n)的复杂性,使其成为最快的排序方法之一。

Bubblesort是最容易实现的,也是运行时最慢的。

编辑:正如评论所说,无论你使用什么算法,只有5000个值的短数组并没有太大的区别,只要它不像Bogosort那样。