假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为: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 // 需要设置遍历位置为当前负数插入位置
}