【发布时间】:2012-07-05 04:15:33
【问题描述】:
可能重复:
which algorithm can do a stable in-place binary partition with only O(N) moves?
这是让我印象深刻的面试题之一
问题: 给定一个正负整数数组,您需要将正数移到一侧 和负数到另一边,订单完好无损。 前任。 {-1,5,3,-8,4,-6,9} 到 {-1,-8,-6,5,3,4,9}。这应该在 O(n) 中完成,并且不需要额外的数组。
首先我想通过像这样的快速排序来做到这一点
伪代码
找到最接近零的元素。使其成为枢轴元素。然后在数组上应用一次快速排序。这是 O(n) 。
唉!但是快速排序不是稳定排序?
之后我提出了以下解决方案
伪代码:
最初, 递增当前直到第一个 +ve 数字和递减结束直到最后一个 -ve 数字
如果电流为负,则增加电流 如果 current 为正,则将其与 end 的元素交换并减少 current 并结束两者 如果 current >= end ,则中断。
仍然没有得到正确的答案。需要这方面的建议
【问题讨论】:
-
这不是一个解决方案,而是一个注意事项:复杂性约束(O(n),又名“线性”)是一个很大的提示。您不能使用快速排序,因为它平均 nlog(n) 并且在最坏的情况下是二次的。实际上,您不能使用任何具有类似要求的算法来比较元素,因为所有这些算法的复杂度都至少为 nlog(n)。您必须对元素进行排序,而无需将它们全部相互比较。 [顺便说一句,当我说“日志”时,它是 log-base-2。]
-
我可能是错的,但也许他们只是想看看您如何解决问题而不是获得实际的解决方案? Radix Sort 最接近,但我认为没有任何实现同时就地和稳定。对于只有一位数的数字数组,它也只是 O(n)。不过还是不错的。
-
@Jesse:我认为这不仅仅是相关的,这是一个骗局。或者你觉得有什么不同?
-
@BenVoigt:实际上,我没有。标记为骗子。