上周我偶然发现了作者在第二页提到的this paper:
请注意,这会产生整数边权重的线性运行时间。
第三页上的内容相同:
这产生了整数边权重的线性运行时间和基于比较的排序的O(m log n)。
在第8页:
特别是,使用快速整数排序可能会显着加速GPA。
这是否意味着在特殊情况下对于整数值存在O(n)排序算法?或者这是图论的专长?
PS:
可能参考文献[3]可能会有所帮助,因为在第一页上他们说:
[...]图表类已经实现了进一步的改进,例如整数边权重[3],[...]
但我无法访问任何科学期刊。
答案 0 :(得分:56)
是的,基数排序和计数排序为O(N)
。它们不是基于比较的排序,已被证明具有Ω(N log N)
下限。
确切地说,基数排序为O(kN)
,其中k
是要排序的值中的位数。计数排序为O(N + k)
,其中k
是要排序的数字的范围。
在k
足够小的特定应用中,基数排序和计数排序在实践中表现出线性时间性能。
答案 1 :(得分:12)
比较分类平均必须至少为Ω(n log n)。
但是,counting sort和radix sort与输入大小呈线性关系 - 因为它们不是比较排序,它们利用输入的固定结构。
答案 2 :(得分:5)
计算排序:http://en.wikipedia.org/wiki/Counting_sort如果你的整数相当小。 如果您有更大的数字,则进行基数排序(这基本上是计数排序的概括,或者如果您愿意,可以对更大数字进行优化):http://en.wikipedia.org/wiki/Radix_sort
答案 3 :(得分:2)
虽然不太实用(主要是由于大量的内存开销),我想我会提到Abacus (Bead) Sort作为另一个有趣的线性时间排序算法。
答案 4 :(得分:1)
这些基于硬件的排序算法:
A Comparison-Free Sorting Algorithm
Sorting Binary Numbers in Hardware - A Novel Algorithm and its Implementation
Laser Domino Sorting Algorithm - 我根据Counting排序进行的一项思考实验,旨在实现O(n)
时间复杂度超过Counting Sort的O(n + k)
。
答案 5 :(得分:0)
添加更多细节 - 实际上,迄今为止最好的排序算法不是O(n),而是0(n \ sqrt {\ log \ log n})。
您可以在论文中查看有关此算法的更多详细信息: http://dl.acm.org/citation.cfm?id=652131