O(n)排序算法可能吗?

时间:2011-10-05 00:52:58

标签: algorithm sorting

只是一个简单的算法来排序小整数,但它必须是O(n)。

5 个答案:

答案 0 :(得分:8)

radix sortO(n)的一种方法。由于你正在处理小整数,所以实现它应该不会太难。

答案 1 :(得分:1)

当然,O(n)定义中的细则可以得到你。基数排序,例如,当你想要在容纳更多值时必须创建更深的树时,它实际上是n * log(n) - 它们只是设法通过限制数量来定义它为O(n)要排序的值。在一般意义上,没有办法真正击败n * log(n)。

例如,对于8位值,我可以通过简单地使用256项数组轻松实现O(n)。但是,如果我去,比方说,甚至是32位值,那么我必须有一个带有4G条目的阵列,并且该阵列的存储器芯片的地址解码器将以内存芯片大小的log(n)增长。是的,我可以说4G条目的版本是O(n),但在电子级别,寻址是log(n)更慢,更复杂。此外,芯片内部的总线必须驱动更多的电流,一旦“读取”,存储器单元需要更长的时间将其内容转储到总线上。所有这些效果都是log(n)。

答案 2 :(得分:0)

简单地说:

  • 如果您没有关于您的号码的先前信息,那么您的排序不能比O(nlogn)更好
  • 如果你有更多的信息(比如你正在处理整数的事实),你可以有一些O(n)算法

一个很好的资源是these Wikipedia tables。看看第二个。

答案 3 :(得分:0)

据我所知,基于比较的排序算法共享O(nlogn)的下限。 为了实现O(n),我们可能不能使用任何基于比较的算法。此外,输入必须具有其他属性。 在你的例子中,我想小整数意味着整数落在指定的范围内。 如果是这种情况,您可以尝试使用桶/基数排序算法,这不需要任何比较。 举一个简单的例子,假设您有n个整数要排序,所有这些都属于区间[1,1000]。你只需要生成1000个桶,然后遍历n个整数,如果整数等于500,则转到桶500,等等。最后,连接所有桶以获取排序列表。该算法采用O(n)。

答案 4 :(得分:0)

基于比较的排序的最佳值是O(n * log(n)),证明并不是很困难。但是你可以使用计数排序,这是基于枚举或非常类似的桶排序...你也可以使用基数排序,但它不是排序本身。 Radix排序只能迭代地调用其他一些稳定的排序......