Algorithm 有O(n)整数排序算法吗?

Algorithm 有O(n)整数排序算法吗?,algorithm,language-agnostic,sorting,time-complexity,Algorithm,Language Agnostic,Sorting,Time Complexity,上周,我无意中发现了作者在第二页提到的地方: 请注意,这会产生整数边权重的线性运行时间 第三页也一样: 这将产生整数边权重的线性运行时间和基于比较的排序的O(m logn) 在第8页: 特别是,使用快速整数排序可能会大大加快GPA 这是否意味着在特殊情况下,整数值有O(n)排序算法?或者这是图论的一个专业 PS: 参考文献[3]可能会有所帮助,因为他们在第一页上说: 对于[…]图类,例如整数边权重[3],[…]已经实现了进一步的改进 但是我没有访问任何科学期刊。是的,并且是O(N)。它们不是基于

上周,我无意中发现了作者在第二页提到的地方:

请注意,这会产生整数边权重的线性运行时间

第三页也一样:

这将产生整数边权重的线性运行时间和基于比较的排序的O(m logn)

在第8页:

特别是,使用快速整数排序可能会大大加快GPA

这是否意味着在特殊情况下,整数值有O(n)排序算法?或者这是图论的一个专业

PS:
参考文献[3]可能会有所帮助,因为他们在第一页上说:

对于[…]图类,例如整数边权重[3],[…]已经实现了进一步的改进

但是我没有访问任何科学期刊。

是的,并且是
O(N)
。它们不是基于比较的排序,已经证明它们具有
Ω(N logn)
下限

精确地说,基数排序是
O(kN)
,其中
k
是要排序的值中的位数。计数排序是
O(N+k)
,其中
k
是要排序的数字的范围


在某些特定应用中,
k
足够小,以至于基数排序和计数排序在实践中都表现出线性时间性能。

比较排序的平均值必须至少为Ω(n logn)

但是,它们与输入大小成线性比例-因为它们不是比较排序,所以它们利用了输入的固定结构。

计数排序:如果整数相当小。 基数排序,如果您有较大的数字(这基本上是计数排序的推广,如果您愿意,这是对较大数字的优化):


还有bucket排序:

虽然不太实用(主要是因为内存开销大),但我想我会提到另一种有趣的线性时间排序算法。

这些基于硬件的排序算法:



-我在计数排序的基础上进行了一次思维实验,目的是在计数排序的时间复杂度上实现时间复杂度
O(n)
O(n+k)

增加一点细节-实际上迄今为止最好的排序算法不是O(n),而是O(n) √(日志 日志 n) )预计时间


您可以在中查看有关此算法的更多详细信息。

下限始终表示为Ω。说O下界没有语义意义。否则+1。只有当整数的最大可能值小于或等于n时,它们才是
O(n)
,否则它们就是
O(max_int)
,不是吗?这只是语义而已。数字不必以10为基数。我可以将其设置为以256为基数,这与您的论点基本相同。@David“因此,对于k位的n个键,基数排序的效率是O(kn)。由于k通常是对数n的顺序,因此基数排序似乎并没有真正超过最佳比较排序的O(n log n)时间。然而,O(n log n)最佳比较排序的时间统计比较的次数,最快的比较时间是k。如果我们统计原始操作的次数,那么合并排序(或其他快速比较排序)将在O(kn log n)时间内执行。“@polygene”因为k通常是log n的顺序”这是为什么?要知道为什么特殊情况可以帮助,考虑在0到9之间排序一百万个整数的情况。您可以简单地计算每个数字的数量,然后根据数字的数量将数字按正确的顺序排列。这是计数排序的基础。谢谢大家!我学到了很多。请看这里,了解我在这个问题上编写的一些Java基准测试:我制作了其中一个作为笑话()。为了破坏punchline,它将输入视为一个位数组而不是字节数组,并将其“排序”为
000000111111
。big-O可能很吸引人,但在软件中实现时,执行速度比quicksort慢10倍左右。