排列+ ve和-ve数字的数组,订单完整

时间:2012-07-05 04:15:34

标签: c++ algorithm

  

可能重复:
  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数和去除结束直到最后一个数字

如果电流为负,则增加电流 如果电流为正,则将其与结束时的元素交换并减小电流并结束两者 如果当前> =结束,则中断。

仍未得到正确答案。需要建议

2 个答案:

答案 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)也不需要分配额外数组的解决方案。