什么样的算法提供最好的最坏情况性能?

时间:2009-04-21 15:42:30

标签: algorithm sorting

对于绝对最坏情况,最快的已知排序算法是什么?我不关心最好的情况,如果这很重要,我假设一个巨大的数据集。

16 个答案:

答案 0 :(得分:17)

确保你已经看到了这个:

visualizing sort algorithms - 它帮助我决定使用什么类型的alg。

答案 1 :(得分:9)

取决于数据。例如,对于整数(或任何可以表示为整数的东西),最快的是radix sort,对于固定长度值,最坏情况复杂度为O( n )。最佳通用比较排序算法具有O( n log n )的复杂性。

答案 2 :(得分:7)

如果使用二进制比较,最好的排序算法需要完成O(N log N)比较。如果您正在寻找具有良好最差情况性能的内容,我会查看MergeSortHeapSort,因为它们在所有情况下都是O(N log N)算法。

如果所有数据都适合内存,HeapSort很好,而MergeSort允许您更好地进行磁盘排序(但总体上需要更多空间)。

Wikipedia排序算法页面上提到的其他不太知名的算法都具有O(n log n)最差情况性能。 (根据mmyers的评论)

答案 3 :(得分:5)

对于预算无限的人

滑稽但正确: Sorting networks交易空间(以实际硬件术语表示)优于O(n log n)排序!

不使用这样的硬件(不太可能),你有一个最低comparison sorts O(n log n)的下限

O(n log n)最坏情况性能(无特定顺序)

击败n log n

如果您的数据适合它,您可以超过n log n限制,但也要关注输入数据中的数量

RadixBucket可能就是最着名的例子。如果没有关于您的特定要求的更多信息,那么更深入地考虑这些要求并不富有成效。

答案 4 :(得分:2)

Quicksort通常是最快的,但如果您想要最好的最坏情况时间,请尝试HeapsortMergesort。这些都有O(n log n)最差的时间表现。

答案 5 :(得分:2)

如果您拥有一个巨大的数据集(即比可用内存大得多),您可能会将数据放在磁盘/磁带/某些东西上,而且需要进行外部排序。

合并排序在这种情况下效果很好;与大多数其他类别不同,它不涉及随机读/写。

答案 6 :(得分:1)

它主要与数据集的大小有关,以及该集合是否已经被排序(或者它当前处于什么顺序)。

整本书都是用搜索/排序算法编写的。假设最坏的情况,你不会找到“绝对最快”,因为不同种类的情况会有不同的情况。

答案 7 :(得分:1)

取决于尺寸,根据 Big O符号O(n)

以下是您要比较的排序算法列表BEST AND WORST CASE。 我的偏好是2路MergeSort

答案 8 :(得分:1)

如果你有足够庞大的数据集,你可能正在考虑对单个数据库进行排序,然后使用merge-sort来合并这些数据库。但在这一点上,我们所说的数据集足够大,远远大于主存。

我想最正确的答案是“它取决于”。

答案 9 :(得分:1)

这取决于数据类型和资源类型。例如,有一些并行算法击败了Quicksort,但考虑到你如何提出问题,你不太可能访问它们。有时候,一种算法的“最坏情况”对于另一种算法来说是“最好的情况”(快速和合并几乎排序的数据是有问题的,但是使用更简单的技术会很快)。

答案 10 :(得分:0)

假设随机排序的数据,快速排序。

O(nlog n)平均情况,在最坏的情况下为O(n ^ 2),但需要高度非随机数据。

您可能想要描述数据集特征。

答案 11 :(得分:0)

有关Quicksort和Mergesort的比较,请参阅Quick Sort Vs Merge Sort,这是大多数情况下两种较好的算法。

答案 12 :(得分:0)

这一切都取决于您尝试排序的数据。不同的算法对不同的数据有不同的速度。 O(n)算法可能比O(n ^ 2)算法慢,具体取决于您正在使用的数据类型。

答案 13 :(得分:0)

我总是喜欢合并排序,因为它是稳定的(意味着如果两个元素从排序角度来看是相同的,那么它们的相对顺序是明确保留的),但是快速排序也很好。

答案 14 :(得分:0)

图灵机的最低上限是通过 merge sort 实现的,即O(n log n)。虽然在某些数据集上快速排序可能会更好。

除非您使用特殊硬件(例如硬件支持bead sort,其他非比较排序),否则不能低于O(n log n)。

答案 15 :(得分:0)

关于指定问题的重要性:基数排序可能是最快的,但只有当您的数据具有可以分解为独立小块的固定长度键时,它才可用。这限制了它在一般情况下的实用性,并解释了为什么更多人没有听说过它。

http://en.wikipedia.org/wiki/Radix_sort

P.S。这是一个O(k * n)算法,其中k是密钥的大小。