假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为:o(n),o(1)
例如
-3 4 2 -1 7 3 -5
排序后
-3 -1 -5 4 2 7 3
算法思想:从前往后遍历,记录第一个正数的位置,如果遇到负数就将负数插入到正数前面。
Go算法如下:
func sort(a []int) {
var swapidx = -1
for i := 0; i < len(a); i++ {
if a[i] > 0 {
// 记录正整数连续块的首位置
if swapidx == -1 {
swapidx = i
}
continue
}
if swapidx != -1 {
tmp := a[i]
copy(a[swapidx+1:], a[swapidx:i]) // 将正数连续块往后移一个元素
a[swapidx] = tmp // 将负数插入到块前位置
swapidx = -1
i = swapidx // 需要设置遍历位置为当前负数插入位置
}
}
}
另,如果只需将负数在前,正数在后,不用关心原来次序,算法如下:
func sort(a []int) {
left := 0
right := len(a) - 1
for left < right {
if a[left] > 0 && a[right] < 0 {
a[left], a[right] = a[right], a[left]
}
if a[left] < 0 {
left++
}
if a[right] > 0 {
right--
}
}
}