问题

1 不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)

最朴素的方法就是像插入排序一样,从左往右扫描碰到负数就往前插。复杂度为O(n^2)

如果不要求空间,直接把所有正数或者负数保存到另一个数组,然后把原数组中的数放到对应位置,时间是N但是空间也是N

在网上看到一种算法http://qing.weibo.com/1570303725/5d98eeed33000hcb.html

首先,定义这样一个过程为“翻转”:(a1,a2,...,am,b1,b2,...,bn) --> (b1,b2,...,bn,a1,a2,...,am)。其次,对于待处理的未排序整数数组,从头到尾进行扫描,寻找(正正...正负...负负)串;每找到这样一个串,则计数器加1;若计数为奇数,则对当前串做一个“翻转”;反复扫描,直到再也找不到(正正...正负...负负)串。
因为每次扫描只是翻转不相邻的(正正...正负...负负)串,因此所有被翻转的串,从正负数分界处被分为两部分,分别归入前后两个相邻的(正正...正负...负负)串。因此,每趟扫描能消灭一半的(正正...正负...负负)串。最终,总共需要扫描的次数最多为logN。
综上,时间复杂度为O(N*logN)。

2 洗牌算法

有个数组2n长度{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},要求时间复杂度o(n),空间复杂度0(1)。
http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118

太复杂了,看不太懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值