在O(n)时间内对序列进行排序

时间:2011-03-21 14:01:46

标签: c# java c algorithm

  

可能重复:
  Sorting in linear time?

假设给出了一个n个元素的序列S,每个元素都是[0,n ^ 2-1]范围内的整数。 我们可以在O(n)时间对它进行排序吗?

请不要介意我问太多面试问题。我很有兴趣。

7 个答案:

答案 0 :(得分:10)

没有。

当唯一的前提条件是0-N²范围内的整数时。

  • 计数排序不起作用,因为扫描(不同输入的位模式或重复输入的存储区)将在O(N²)中完成
  • 该范围会使基数排序的密钥长度依赖于N,因此基数在O(N)中不起作用。

任何涉及“当N很小”的语句都会使任何基于O的参数无效。

答案 1 :(得分:4)

只需使用Radix Sort

答案 2 :(得分:3)

对于某些特殊情况,存在O(N)(与NlogN相对)排序算法,其中您有一组已知的有界对象(例如指定范围内的整数):

radix sort

bucket sort

答案 3 :(得分:0)

是的,如果我们有一个类似哈希的函数,任何整数都会在O(1)时间内计算它在排序数组中的位置。然而,设计这样的哈希函数是IMO的问题 - 我无法提出任何关于它如何工作的详细想法。

答案 4 :(得分:0)

Programming Pearls涵盖了此问题的变体。如果S很大并且您可以假设没有重复,则最快的方法是分配长度为n ^ 2的位向量,并使用它来标记范围内每个数字的存在与否。

答案 5 :(得分:0)

如果n足够小,您可以使用直方图。从输入序列构建直方图,然后从该直方图构造输出序列。伪代码:

H = histogram(input_sequence);
while (not H.empty):
    E = H.smallest_value_element()
    //E.value - value of element, E.count - count in input sequence
    H.remove(E)
    repeat E.count times: output_sequence.append(E.value)

答案 6 :(得分:-2)

如果有n ^ 2-1位可用内存,只需扫描序列,将每个由序列值索引的位设置为1.即序列大小为O(n)。随后,测试存在是O(1)操作。

当然,如果你想读出排序后的序列,那就是O(n ^ 2),因为你需要扫描n ^ 2-1位的整个集合来寻找1s。