Big-Theta(n)线性排序算法?

时间:2012-10-22 04:57:28

标签: arrays algorithm linear

设计线性算法以重新排列给定n个元素数组的元素,使其所有负数先于任意零,并且任何零都在任何正数之前。它还应该是节省空间的,因此它不需要超过恒定数量的额外空间。

我想到的一切都比O(n)大得多,并且会喜欢一些提示/提示/帮助/ java代码!谢谢!!

3 个答案:

答案 0 :(得分:2)

帮助?提示:Quicksort的分区部分,枢轴为0See this Wikipedia article,查找就地版本。


我刚刚意识到如果你实现上面链接中给出的确切版本,如果你有零的欺骗,它可能没有用。我的陈述仍然是你需要使用Quicksort的分区部分,但分区将由Dutch National Flag problem或三路分区完成。以下是您的伪代码

//assume index based 1
A[1..n]
p = 0
q = n+1
i = 1
while i < q if A[i] < 0 swap(i, ++p) else if A[i] > 0 swap(i, --q) else i++

时间复杂度:O(n)
空间复杂度:O(1)

答案 1 :(得分:2)

使用Radix Sort的修改版本,可以在线性时间内工作的唯一排序是非基于比较的排序(因此列表/数组中的条目不会相互比较),这样就可以了解其他内容(证明涉及最小高度的比较树,为什么比较项目的排序总是至少为nlogn。)

答案 2 :(得分:1)

如果您只需要根据3个范围重新排列项目,负零和正。

一个简单的解决方案是使用单个数组迭代(O(n))计算负数,零和正数项(如果您已经知道数组的大小,实际上您不需要计算正数的数量)。

通过第二次迭代,您将根据它们的范围将项目(从第一个开始)交换到适当的索引,然后增加索引。

就是这样,没有额外的记忆和teta(n)时间复杂性。