方法一:
分析:
要使得奇数全位于偶数前面,我们需要定义两个变量left和right,left从数组的0好下标开始往后遍历,right从数组的最后一个元素开始遍历,只有当left下标的元素为偶数并且right下标的元素为奇数时,我们才交换这两个元素,由此可见,无论是由left下标去寻找偶数还是由right下标去寻找奇数,我们都在循环里去寻找,找不到的话left往后移,right往前移,代码如下:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
reOrderArray(array);
System.out.println(Arrays.toString(array));
}
public static void reOrderArray(int [] array) {
int left = 0;
int right = array.length-1;
int tmp = 0;
while(left < right) {
while(left < right) {
if(array[left]%2 != 0){
left++;
break;
}else {
break;
}
}
while(left < right) {
if(array[right]%2 == 0){
right--;
break;
}else {
break;
}
}
if(left < right) {
tmp = array[left];
array[left] = array[right];
array[right] = tmp;
left++;
right--;
}
}
}
运行结果如下:
方法二:
分析:方法一并不能保证奇数和奇数,偶数和偶数之间的相对位置不变,下面的方法就可以保证它们的相对位置不变。方法二的思想就是再定义一个数组,遍历两次数组,第一次是先将原数组的所有奇数放在新的数组前面,第二次是将原数组的所有偶数放在新数组的后面,代码如下:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
reOrderArray(array);
System.out.println(Arrays.toString(array));
}
public static void reOrderArray(int [] array) {
//1 2 3 4 5 6 7
int[] ptr = new int[array.length];
int j = 0;
for(int i = 0; i < array.length; i++) {
if(array[i]%2 != 0) {
ptr[j] = array[i];
j++;
}
}
for(int i = 0; i < array.length; i++) {
if(array[i] %2 == 0) {
ptr[j] = array[i];
j++;
}
}
for(int i = 0; i < array.length; i++) {
array[i] = ptr[i];
}
}
运行结果如下:
在方法二这里我们引申一个知识点:
在Java中,方法的参数传递,对于基本类型都是按值传递,对对象来说,是将对象的引用传递给了方法,在方法中,只有对对象进行修改才能改变该对象的值,如果只修改对象的引用是不会修改对象的值的。对于上述方法二中最后的赋值,无论换成以下两种方法中的哪一个都是不可以的,方法一只是给形参赋值了一个新的引用,这样并不会改变方法外面数组的内容;而方法二只是给形参赋值了一组新的数据,也并不会改变方法外面数组的内容。
//方法一:
array = ptr;
//方法二:
array = Arrays.copyOf(ptr,ptr.length);