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
太复杂了,看不太懂