字面意思,调整奇数位于偶数前面。
算法思路:使用指针分别指向数组的头和尾,达成“前偶后奇”的条件后,交换值
这里提供两种方法,个人推荐第二种,更容易理解
法1
private static void putNumber(int []number){
int length = number.length;
int i = 0, j = length - 1;
while(i <= j){
// 如果一个偶数一个奇数
if((number[i] & 1) == 0 && (number[j] & 1) != 0){
int temp = number[i];
number[i] = number[j];
number[j] = temp;
i ++;
j --;
}
// 如果两个偶数
else if((number[i] & 1) == 0 && (number[j] & 1) == 0){
j --;
}
// 如果两个奇数
else if((number[i] & 1) != 0 && (number[j] & 1) != 0){
i ++;
}
// 如果不需要交换
else{
i ++;
j --;
}
}
}
法2:
这种分成了两个方法,目的是使方法抽离,实际上可以合成一个
// 调整数组顺序使得奇数位于偶数前
private static void reorderOddEven(int []number){
int length = number.length;
int i = 0, j = length - 1;
reorderOddEven(number, i, j);
}
private static void reorderOddEven(int []number, int begin, int end){
while(begin < end){
// 循环,直到number[i]是偶数,number[j]是奇数
while((number[begin] & 1) != 0){
begin ++;
}
while((number[end] & 1) == 0){
end --;
}
if(begin < end){
int temp = number[begin];
number[begin] = number[end];
number[end] = temp;
begin ++;
end --;
}
}
}