Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 哪种排序算法提供了最好的最坏情况性能?_Algorithm_Sorting - Fatal编程技术网

Algorithm 哪种排序算法提供了最好的最坏情况性能?

Algorithm 哪种排序算法提供了最好的最坏情况性能?,algorithm,sorting,Algorithm,Sorting,对于绝对最坏情况,已知最快的排序算法是什么?我不关心最佳情况,我假设一个庞大的数据集,如果这很重要的话。假设随机排序的数据,快速排序 O(nlog n)平均情况,O(n^2)在最坏情况下,但这需要高度非随机数据 您可能需要描述数据集的特征。这主要与数据集的大小以及数据集是否已排序(或当前的顺序)有关 整本书都是关于搜索/排序算法的。假设出现最坏情况,您不会找到“绝对最快的”,因为不同的排序有不同的最坏情况。请参阅Quicksort和Mergesort的比较,这两种算法在大多数情况下都是比较好的。

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

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

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


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

这主要与数据集的大小以及数据集是否已排序(或当前的顺序)有关


整本书都是关于搜索/排序算法的。假设出现最坏情况,您不会找到“绝对最快的”,因为不同的排序有不同的最坏情况。

请参阅Quicksort和Mergesort的比较,这两种算法在大多数情况下都是比较好的。

请确保您已经看到:


-它帮助我决定使用哪种alg

如果使用二进制比较,最好的排序算法需要进行O(N logn)比较才能完成。如果你在寻找一些最坏情况下性能良好的算法,我会看看和,因为它们在所有情况下都是O(N logn)算法

如果所有数据都放在内存中,HeapSort很好,而MergeSort允许您更好地进行磁盘排序(但总体上占用更多空间)


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

这完全取决于您试图排序的数据。对于不同的数据,不同的算法有不同的速度。O(n)算法可能比O(n^2)算法慢,这取决于您处理的数据类型。

根据大O表示法O(n)它取决于大小

下面是供您比较的排序算法列表。
我的首选是双向排序,因为它是稳定的(也就是说,如果从排序的角度看两个元素相等,那么它们的相对顺序会被显式保留),但快速排序也很好。

快速排序通常是最快的,但是如果你想在最坏的情况下获得好的排序效果,请尝试或。它们都有
O(n log n)
最差的时间性能。

如果您有一个足够大的数据集,您可能需要对单个数据箱进行排序,然后使用合并排序来合并这些数据箱。但在这一点上,我们谈论的数据集足够大,远远大于主内存


我想最正确的答案应该是“视情况而定”。

图灵机的最低上界是通过合并排序实现的,即O(n logn)。尽管在某些数据集上快速排序可能更好

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

适用于预算无限的男士 幽默但正确: 交换空间(以实际硬件术语)以获得优于O(n log n)的排序

如果不使用这样的硬件(不太可能提供),您就有一个O(n log n)的最佳下界

O(n log n)最坏情况性能(无特定顺序)
击打原木 如果您的数据符合它的要求,那么您可以克服n log n限制,但也要关心输入数据中的位数


这可能是最著名的例子。如果没有更多的关于您的特定需求的信息,那么深入地考虑这些问题是没有意义的。

它取决于数据的类型和资源的类型。例如,有一些并行算法可以击败快速排序,但考虑到你是如何提问的,你不太可能访问它们。有时,一种算法的“最坏情况”是另一种算法的“最佳情况”(几乎排序的数据在Quick and Merge中有问题,但在使用更简单的技术时会出现问题)。

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


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

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

如果您有一个庞大的数据集(即比可用内存大得多),那么您的数据很可能存在于磁盘/磁带/具有昂贵随机访问的东西上,因此您需要外部排序


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

请告诉我们有关您的具体场景的更多信息,以便人们可以建议常见排序算法的优缺点。否则,我不认为有任何明确的答案。我建议您明确表示您是否只关心大O表示法,还是只关心ON log(N)实现中涉及的常量是否重要。基数排序等增加了一些混乱,因为它们非常依赖于数据(你的问题太短了)。我说的是,如果一个算法的最坏情况是n^2,另一个是n-log-n,则后者将赢得一个大数据集,即使n^2的场景非常罕见。@Greg:O(n-log-n)是任何基于比较的排序的理论上可能的最佳复杂性。有许多算法的最坏情况复杂度为O(n logn)(请参阅中的表格)。请更新问题标题以反映具体问题,我建议:“什么排序算法提供了最佳的最坏情况性能?”但OP要求的是绝对最坏情况——在这种情况下,快速排序是N^2。OQ是最坏情况下已知的最快排序算法。O(n^2