题目要求:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
实现思路一:(用空间换时间)生成一个与输入的整数数组相同大小的数组作为偶数部分的存放位置,调整完后再把偶数部分放回到原来数组的后面。int size = array.length;
int size = array.length;
int position = 0;//记录奇数移到的位置,position+1表示奇数总个数
int[] right = new int[size];//存放偶数顺序的数组
int j = 0;
for (int i = 0; i < size; i++) {
if (array[i] % 2 != 0) {//若为奇数
if (i == position) {//表示当前位置以前都是奇数
position++;
continue;
}
//交换奇偶数
array[i] = array[i] ^ array[position];
array[position] = array[i] ^ array[position];
array[i] = array[i] ^ array[position];
//将奇数的位置+1
position++;
} else {
//存放偶数
right[j++] = array[i];
}
}
for (int i = position,k = 0; i < size&&k<j; i++ , k++) {
array[i] = right[k];
}
right = null;
实现思路二:(利用插入排序的原理,经别人提醒)不断比较当前位置的值跟当前位置的前一位置的值,看是否满足前偶后奇的规则。
(快速排序的排序规则:若升序,则看是否满足前大后小,就是不断的把小数从后面一直忘前挪,这样就不会影响数组中未排序的数的相对顺序)
public static void reOrderArray1(int[] array) {
int size = array.length;
for (int i = 0; i < size - 1; i++) {//i标志着奇数序列的最后一个位置,i+1表示奇数总个数
for (int j = i + 1; j > 0; j--) {//从下标i+1开始,不断往前比较
//若当前下标指向的值为奇数,当前下标的前一位置的值为偶数,则交换两数的位置
if (array[j] % 2 != 0 && array[j - 1] % 2 == 0) {
array[j] = array[j] ^ array[j - 1];
array[j - 1] = array[j] ^ array[j - 1];
array[j] = array[j] ^ array[j - 1];
}
}
}
}
这边有一个注意点就是:不要完全模仿插入排序的结构,即不要在第二重循环的判断条件中判断是否符合前偶后奇的规则,这会造成交换的次数减少很多,原因是逻辑与运算的短路运算规则。第二重循环语言不要写成
for (int j = i + 1; j > 0 && array[j] % 2 != 0 && array[j - 1] % 2 == 0; j--)