给定一个具有n
个整数的数组,它有正整数和负整数。现在你需要以一种特殊的方式对这个数组进行排序,这样在排序之后,负整数应该在前面,正整数应该在后面。也不应改变相对位置。
例: -1 1 3 -2 2
答: -1 -2 1 3 2
编写一个具有以下约束O(n)
时间复杂度和O(1)
空间复杂度的算法。
使用分而治之的appraoch我想出O(nlogn)
算法。我们怎样才能做得更好。
答案 0 :(得分:1)
您不需要使用分而治之的方式对数组进行完全排序。一个类似快速排序的分区步骤应该足以将负数放在正数之前,那就是O(N)。
答案 1 :(得分:1)
我能想到的最好的方法是以下(除非负整数的数量是一些常数,否则它不是O(n)):
复杂性是没有任何额外存储的最小班次数。我想不出O(1)空间中更好的策略。唯一的另一种可能性是执行阵列的一些旋转以一次将元素移位多个位置(在计算初始线性通过中的点之前和之后的负元素的总数之后),但是这似乎肯定会超过O(n)也是。
-1 1 3 -2 2
|---|
-1 -2 1 3 2
|-----|
答案 2 :(得分:0)
我将其视为状态机。
你最多移动每个数字1次,所以它的时间是O(n)。并且只有交换空间和存储的索引,所以它在空间中是O(1)。