数组排序使得数组负数在正数左边且按照原来的顺序

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

        }

    }

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值