思路
- 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序
- 从前往后遍历数组,如果发现偶数,那么在偶数之后的剩余元素中找出一个奇数,交换两数,使得奇数在前
- 直到数组遍历完成
代码
import java.util.Arrays;
public class pra1220 {
public static void main(String[] args) {
//调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
int[] arr={2,4,9,7,6,5};
System.out.print("Before change:");
String result1= Arrays.toString(arr);
System.out.println(result1);
change(arr);
System.out.print("After change:");
String result2= Arrays.toString(arr);
System.out.println(result2);
}
public static void change(int[] arr) {
int temp=0;
for(int even=0;even<arr.length;even++){
if(arr[even]%2==0){
for(int odd=even+1;odd<arr.length;odd++){
if(arr[odd]%2!=0){
temp=arr[odd];
arr[odd]=arr[even];
arr[even]=temp;
break;
}
}
}
}
}
}
运行结果
如果给上面的题目再加一个条件,如果调整后的数组中的元素,奇数和奇数的相对位置不变,偶数和偶数的相对位置不变,应该怎么做呢?
思路
- 由于相对位置不变,所以要求算法是稳定的.
- 在这里考虑使用插入排序,已排区间为 [0,bound),待排区间为[bound,arr.length)
- 我们将待排区间的第一个元素拿出来,如果它是一个奇数,那么我们在已排区间中,找到一个合适位置,将其插入;如果是一个偶数,不用调整,继续下一次循环即可.
代码
public class Solution {
public int[] reOrderArray (int[] array) {
for(int bound=1;bound<array.length;bound++){
int v=array[bound];
//如果是偶数,什么都不做,继续下一次循环即可
if(((v-1)&1)==1){
continue;
}
int cur=bound-1;
for(;cur>=0;cur--){
if(((array[cur]-1)&1)==1){
array[cur+1]=array[cur];
}else{
break;
}
}
array[cur+1]=v;
}
return array;
}
}
注意: ((v-1)&1)==1 用来判断v是否为偶数,采用位运算代替求余运算~