题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题解一
使用辅助数组
- 第一次遍历:遇到奇数直接放入新数组
- 第二次遍历:遇到偶数放入新数组
- 进行数组copy
/**
* 方法一:
* 使用辅助数组
* 第一次遍历:遇到奇数直接放入新数组
* 第二次遍历:遇到偶数放入新数组
* 进行数组copy
* @param array
*/
public void reOrderArray(int [] array) {
int[]newArr = new int[array.length];
int index = 0;//新数组指针
//放奇数
for(int i=0;i<array.length;i++){
if(array[i]%2 != 0){
newArr[index++] = array[i];
}
}
//放偶数
for(int i=0;i<array.length;i++){
if(array[i]%2 == 0){
newArr[index++] = array[i];
}
}
//数组copy
for(int i=0;i<array.length;i++){
array[i] = newArr[i];
}
}
题解二
初始化操作:记录一个变量i表示已经将奇数放好的下一个位置,显然最开始i=0,表示还没有一个奇数放好。
j 表示数组的下标,初始值为0, 表示从下标0开始遍历。
- 如果遇到偶数,j++
- 如果遇到奇数,假设位置为j,就将此奇数插入到i所指的位置,然后i往后移动一个位置,在插入之前,显然会涉及到数据的移动,也就是将[i,j-1]整体往后移动。
- 直到整个数组遍历完毕,结束
public void reOrderArray2(int[] array) {
int i = 0;
for (int j = 0; j < array.length; ++j) {
if (array[j] % 2 != 0) {
int temp = array[j];
for (int k = j - 1; k >= i; --k) {
array[k + 1] = array[k];
}
array[i++] = temp;
}
}
}