看到过这么一个算法题,据说是一个面试题。一个整数数组,包含有正数和负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1)
先看个时间复杂度O(n^2)的:
for(i=n-1; i>=0; i--)
{
int j=i;
int k=0;
int temp=0;
if(a[j]<0)//如果是负数
k++;//加1.
else if(a[j]>0&&k==0)//否则,如果是正数,且后面没有负数(k==0)
continue;//跳出本次循环
else//否则
{
temp=a[j];//暂存这个正数。
for(int m=1; m<=k; m++)//移到所有的负数后面去。
{
a[j+m-2]=a[j+m-1];
}
a[j+m-1]=tmp;
continue;
}
}