使用负整数和正整数对数组进行排序

时间:2015-03-23 17:54:44

标签: algorithm sorting

给定一个具有n个整数的数组,它有正整数和负整数。现在你需要以一种特殊的方式对这个数组进行排序,这样在排序之后,负整数应该在前面,正整数应该在后面。也不应改变相对位置。

  

例:   -1 1 3 -2 2

     

答:   -1 -2 1 3 2

编写一个具有以下约束O(n)时间复杂度和O(1)空间复杂度的算法。

使用分而治之的appraoch我想出O(nlogn)算法。我们怎样才能做得更好。

3 个答案:

答案 0 :(得分:1)

您不需要使用分而治之的方式对数组进行完全排序。一个类似快速排序的分区步骤应该足以将负数放在正数之前,那就是O(N)。

答案 1 :(得分:1)

我能想到的最好的方法是以下(除非负整数的数量是一些常数,否则它不是O(n)):

  1. 识别2个负整数之间的正整数区域
  2. 将所有正整数向右移动,并将负整数放在区域的开头。
  3. 复杂性是没有任何额外存储的最小班次数。我想不出O(1)空间中更好的策略。唯一的另一种可能性是执行阵列的一些旋转以一次将元素移位多个位置(在计算初始线性通过中的点之前和之后的负元素的总数之后),但是这似乎肯定会超过O(n)也是。

    -1 1 3 -2 2
      |---|
    
    -1 -2 1 3 2
         |-----|
    

答案 2 :(得分:0)

我将其视为状态机。

  • 状态1:在“看到负数”模式。如果输入为负数,则在状态1中继续。如果输入为正数,则存储当前索引并继续在状态2中。
  • 状态2:在“已经看到正数,寻找负数”模式。如果输入为正数,则在状态2中继续。如果输入为负数,则将其从状态1移至存储的索引(向前移动中间正数)并返回到状态1.

你最多移动每个数字1次,所以它的时间是O(n)。并且只有交换空间和存储的索引,所以它在空间中是O(1)。