可能重复:
Sorting in linear time?
假设给出了一个n个元素的序列S,每个元素都是[0,n ^ 2-1]范围内的整数。 我们可以在O(n)时间对它进行排序吗?
请不要介意我问太多面试问题。我很有兴趣。
答案 0 :(得分:10)
没有。
当唯一的前提条件是0-N²范围内的整数时。
任何涉及“当N很小”的语句都会使任何基于O的参数无效。
答案 1 :(得分:4)
只需使用Radix Sort。
答案 2 :(得分:3)
答案 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。