可能是重复问题:
如何在线性时间内排序?
假设我们有一个包含n个元素的序列S,每个元素都是范围在[0,n^2-1]之间的整数。 我们能否在O(n)时间内对其进行排序?
请不要介意我问了太多的面试问题。我只是想学习。
可能是重复问题:
如何在线性时间内排序?
假设我们有一个包含n个元素的序列S,每个元素都是范围在[0,n^2-1]之间的整数。 我们能否在O(n)时间内对其进行排序?
请不要介意我问了太多的面试问题。我只是想学习。
序号。
当唯一的前提条件是在0-N²范围内的整数时。
任何涉及“当N很小时”的陈述都会使任何基于O的论证无效。
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)
是的,如果我们有一个类似哈希函数的东西,可以在O(1)时间内计算任何整数在排序数组中的位置。然而,设计这样的哈希函数在我看来是有问题的 - 我想不出任何详细的想法来解决它。
编程珠玑涵盖了这个问题的变化。如果S很大并且可以假设没有重复项,则最快的方法是分配长度为n ^ 2的位向量,并使用它来标记范围内每个数字的存在或不存在。