在O(n)时间排序?

时间:2013-10-23 05:43:58

标签: algorithm sorting time-complexity pseudocode linear

我坚持这个问题(2周)。知道如何处理它吗?。

  

设L是n个不同整数的列表,假设L的x元素在[1,750]范围内。设计线性排序算法以排序L

的元素

我已尝试过插入排序。但我不确定我的做法是否正确:

Construct an array of bits. Initialize them to zero.
Read the input, for each value you see set the respective bit in the array to 1.
Scan the array, for each bit set, output the respective value.

复杂性=> O(2n)= O(n)

4 个答案:

答案 0 :(得分:6)

尝试基数排序 - http://en.wikipedia.org/wiki/Radix_sort

如果你认为给定750为常数,则它在O(n)处排序。

基于比较的排序不能在小于O(nlogn)的范围内排序,但如果值的数量由D限制,如果将D视为常数,则可以在O(D * n)或O(n)中排序

答案 1 :(得分:4)

我不会给出一个完整的方法,但这里有一个应该有所帮助的观察。

您已经知道这些数字严格在[1, 750]范围内。在线性时间内计算每个数字的数量并不是特别困难。

一旦掌握了这些信息,你怎么能回到排序列表(再次,线性时间)?


至于你给出的方法,那不是插入排序,它更像是一个桶排序或计数排序(这是我试图暗示的)。我看到的一件事是,如果数组可以包含重复项,则您的方法不起作用。如果你被认为没有,那么你很高兴。否则,您需要修改您必须处理的内容。

答案 2 :(得分:1)

您可以使用计数排序。创建一个输入哈希,并在每次插入时只增加相应索引处的值。这在O(n)时间内用额外的存储器O(n)排序。

答案 3 :(得分:1)

以下是一些代码:

IntegerSort (Array A):
   Dimension Work as Array[1..750]

   Fill Work with (0)

   For i:=0 to A.Length - 1 
     Work[A[i]]++

   n = 0;
   For i:=1 to 750
      For j :=1 to Work[i] 
         A[n++] = i

由于所有循环都是O(n),算法也是O(n)。

在数组Work中,它跨越整个数字范围并用0初始化,将每个元素Work [k]增加1,对于A的所有元素,k = A [i]。 / p>

现在通过扫描Work数组重建数组。任何元素> 0表示原始数组中的一个或多个元素。当我们从1扫描到750时,我们将重建排序的数组。