可能重复:
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数和去除结束直到最后一个数字
如果电流为负,则增加电流 如果电流为正,则将其与结束时的元素交换并减小电流并结束两者 如果当前> =结束,则中断。
仍未得到正确答案。需要建议
答案 0 :(得分:0)
std :: stable_partition完全符合您的要求。
对于C ++ 11,请执行
std::stable_partition(
array.begin(), array.end(),
[] (int i) { return i < 0; });
答案 1 :(得分:0)
如果结果数组与源数组不同,则可以通过两次传递轻松完成:
p = 0; //current index in result array
For i = 0 to length - 1 :
If source[i] < 0 then
result[p] = source[i]
increment p
End if
End for
For i = 0 to length - 1 :
If source[i] >= 0 then
result[p] = source[i]
increment p
End if
End for
如果你想在现场进行,那就有点棘手了。您可以尝试使用冒泡类型,但这是O(n ^ 2):
n = 0 // number of negative items found
For i = 0 to length - 1 :
If array[i] < 0 then
For j = i - 1 downto n :
swap array[j+1] and array[j]
End for
increment n
End if
End for
不幸的是,我想不出既有O(n)也不需要分配额外数组的解决方案。