我通过学校获得了排序算法,我们的任务是审查几种排序算法。该报告的其中一个部分是“何时更快地进行简单排序”。
我的排序算法是:
均为O(n ^ 2)平均值
然后我有以下O(n log n)算法:
和基数排序O(kn)
我对未分类和排序的数据进行了多次测试,范围从n到10到100,000,并且复杂的排序O(n log n)在更快的时间内执行。
我还尝试使用包含n个元素的排序数据集,其中n = 10到n = 100,000
但是O(n log n)算法仍然更快。
所以我的问题是,简单的排序何时比复杂的排序更快。
谢谢, 克里斯。
答案 0 :(得分:2)
这实际上取决于算法的特定实现。通常,插入排序将击败0和低数十个元素之间的大多数O(n log n)排序,但实际数量取决于插入排序的实现方式,数据排序方式,比较成本等等。这就是你几乎必须相互运行排序算法的特定实现来确定哪一个更快的时候。
希望这有帮助!
答案 1 :(得分:2)
在运行时间与输入大小的平方成比例的各种内环中的分支往往非常简单。
在这方面,插入排序通常最有效。
另一方面,对于大小为N的输入,运行时间与N log N成比例的排序具有更复杂的分支。
分支复杂性在运行时显示为常数因子。所以我们有简单而复杂的运行时间
S N^2 and C N log N
在较旧的计算机上,S往往比C小很多。只是为了好玩,你有S = 1和C = 4,那么你有一个可以解决的等式:
1 N^2 = 4 N log N
感兴趣的解决方案是N = 16(日志是基数2)。这是输入的大小,其中“简单”算法具有的更好速度的常数因子被更好的渐近速度克服。通过sinple算法可以更快地对小于16的输入进行排序!对于N>,复杂算法的力量“开始”。 16。
然而,在现代计算机中 - 正如您所发现的 - 硬件级别的更快分支和更好的编译器使S和C更加接近。对于微小的嵌入式处理器而言,根据我的经验,可以更清晰地观察到N ^ 2种类运行速度更快的古老民间传说。
答案 2 :(得分:1)
首先,基数排序不是O(nlogn)
。它是O(kn)
,其中k是任何数字中的最大位数。
O(n^2)
排序可能比O(nlogn)
排序时更快
输入的大小很小。如果您的输入包含~100(甚至~1000)个数字,现代处理器可以显示O(n^2)
种类更快(或与O(nlogn)
相同)。
对于某些情况,当O(n^2)
排序识别要排序的数组时,它可以在排序过程中停止,这在O(nlogn)
的情况下很难(但仍有可能)实现排序
例如,在“插入排序”或“标记冒泡”排序中,如果数组已排序,则可以停止算法。这样可以获得最佳O(n)
效果。
答案 3 :(得分:0)
如果输入很小或者输入几乎已经排序,则“简单”排序算法可以很好地工作。
答案 4 :(得分:0)
要获得这个答案,您将首先了解Big O的工作原理。
10000 n ^ 2是O(n ^ 2) 10 n ^ 3是O(n ^ 3)
所以我们说n是2
然后10 n ^ 3将比10000 n ^ 2更快地工作。
但假设你不知道n或n的长度可能真的很大,那么10000 n ^ 2会更好
答案 5 :(得分:0)
我的问题是,简单的排序何时比复杂的排序更快。
一般很难说; 太多取决于实施细节,数据和硬件等。
但是,我可以给你一个实际的例子。 Quicksort平均具有O(n * log(n))复杂度,插入排序O(n 2 ),请参阅Sorting in Wikipedia。然而,仍然值得在快速排序中切换到微小子阵列上的插入排序,请参阅Algorithms中的 Cutoff to insertion sort by Sedgewick&韦恩(第4版中的第296页)。他们声称“在大多数情况下,5到15之间的任何值都可能很有效。”结果算法优于单独的快速排序或插入排序。