奇数放在偶数前且保证数之间的相对位置不变
类似于快排的partition问题,快排要分为小于大于,等于三个部分,所以需要两个变量less,more来分开,还有一个是cur。而这要分为奇数偶数,需要一个变量mid,还需要cur。
快排一直让less和more处于分界处。
而这个只有一个变量的时候可以先让mid走几步,走到偶数的地方,让它表示第一个开始的偶数,然后cur再等于它的下一个,开始循环。
如果此时是偶数就跳过,是奇数(此时要把这个数插入到mid之前的一个位置,把mid到这个数之间的数全都后移)则将cur此时值保存,mid到cur的偶数全部向后移动,将cur插入mid的地方,mid++,cur++;(因为这里要求是不能改变位置,所以不能直接把奇数交换到后面,而得所有值都向后移动)
这种操作就和快排一样,O(nlogn),因为每操作一个奇数都需要移动mid处到它位置处的所有值。
禁止表达式混用++
public class Solution {
public void reOrderArray(int [] array) {
int mid=0;//作为第一个偶数的分割点
while(mid<array.length && (array[mid] & 1) ==1){
mid++;
}
int cur=mid+1;//既然退出循环,说明这个值就是偶数,记得别用mid++,因为用了之后mid也会+1
while(cur<array.length){
if((array[cur] & 1) ==0){//如果是偶数,则不用操作
cur++;
}else{//如果是奇数,则需要将它向前移动到mid的位置,而mid位置到这个数的位置的值全部向后移动
int num=array[cur];
int index=cur-1;
while(index+1<array.length && index>=mid){
array[index+1]=array[index];
index--;
}
array[mid]=num;
cur++;
mid++;
}
}
}
}