不改变正负数相对顺序重新排列数组----一种解法

大家参考一下,时间O(N)?和空间O(1)。
基本思想是借鉴in-place merge sort:
只做一次扫描,
1,记录第一次出现正数的位置,寻找第二次出现正数的位置或结尾,
2,对两个位置中间进行手摇算法反转
3,重复1,2直到结尾
示例:1,7,-5,9,-12,15
int front=0;
int last =0;
while (last<NUM/*总数*/)
{
一,当front==0,last==3时,反转1,7,-5,于是为-5,1,7,9,-12,15。这时置front=1,last还是3。

二,再次进入,当front==1,last==5(也可以是结尾,有可能最后一个是负数),反转1,7,9,-12,于是为-5,-12,1,7,9,15。这时置front=2,last还是5。

三,ok,last结束,退出循环。
last++;
}

为什么对时间O(N)打问号,主要是这里要考虑,反转存在正数序列(或负数,也可以以负数为反转对象)变大的问题。下回有时间可以再思考一下。
另:消除这种正数序列变大的问题,有一种思想就是分块,把序列分成sqrt(N)块(当然这里也要考虑到正负颗粒的问题),这样整体时间复杂度应该可以控制在O(N)了。
汗~有点晚了-_-。睡了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值