繁体   English   中英

哪种排序算法可提供最佳的最坏情况性能?

[英]What sort algorithm provides the best worst-case performance?

绝对最差情况下最快的已知排序算法是什么? 我不在乎最好的情况,并且即使有关系,也要假设一个庞大的数据集。

确保您已看到以下内容:

可视化排序算法 -它帮助我决定使用哪种排序算法

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

如果使用二进制比较,则最佳的排序算法将使用O(N log N)个比较来完成。 如果你正在寻找一些具有良好的最坏情况下的表现,我想看看归并堆排序 ,因为它们是在所有情况下O(N日志N)的算法。

如果所有数据都适合内存,那么HeapSort会很不错,而MergeSort可以使您更好地进行磁盘排序(但总体上会占用更多空间)。

Wikipedia排序算法页面上提到的其他较不为人知的算法都具有O(n log n)最坏情况的性能。 (基于mmyers的评论)

对于预算无限的男人

有趣但正确:与O(n log n)排序相比, 排序网络可以交易空间(以实际硬件而言)更好!

如果不求助于这种硬件(不太可能使用),则对于最佳比较类型 O(n log n),您将下界

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

击败n log n

如果您的数据合适,则可以突破n ​​log n限制,但还要注意输入数据中的位数

基数存储桶可能是最著名的例子。 如果没有有关您的特定要求的更多信息,则无法更深入地考虑这些要求。

快速排序通常是最快的,但如果你想好最坏情况下的时间,尽量堆排序归并 它们都具有O(n log n)最差时间性能。

如果您有一个巨大的数据集(即比可用内存大得多),则可能会将数据存储在磁盘/磁带/具有昂贵随机访问权限的东西上,因此您需要外部排序。

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

它在很大程度上与数据集的大小以及该集合是否已排序(或当前的顺序)有关。

整个书籍都是根据搜索/排序算法编写的。 假设最坏的情况下,您将不会找到“绝对最快”的情况,因为不同的类别具有不同的最坏情况。

根据Big O符号O(n) ,它取决于大小。

这是最佳和最坏情况排序算法的列表,供您比较。 我的偏好是2种合并方式

如果您有足够大的数据集,则可能正在考虑对单个数据仓进行排序,然后使用merge-sort合并这些仓。 但是在这一点上,我们正在谈论的数据集非常庞大,足以比主存更大。

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

它取决于数据类型和资源类型。 例如,有一些并行算法击败了Quicksort,但是考虑到您如何问这个问题,您不太可能访问它们。 有时,一种算法的“最坏情况”是另一种算法的“最佳情况”(使用Quick and Merge,几乎排序的数据有问题,但是使用简单得多的技术,速度很快)。

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

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

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

有关Quicksort和Mergesort的比较,请参阅快速排序与合并排序 ,这是大多数情况下较好的两种算法。

这完全取决于您要排序的数据。 不同的算法对于不同的数据具有不同的速度。 O(n)算法可能比O(n ^ 2)算法要慢,这取决于您使用的是哪种数据。

我一直喜欢合并排序,因为它很稳定(这意味着如果两个元素从排序角度来看是相等的,那么它们的相对顺序就被明确保留了),但是quicksort也很好。

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

除非您使用特殊的硬件(例如,硬件支持的磁珠分类 ,其他非比较分类),否则您不能低于O(n log n)。

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

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

PS这是O(k * n)算法,其中k是密钥的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM