题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
情况一
不需要保证奇数和偶数之间相对位置不变。
这里可以用快排的思想。时间复杂度为O(n)
public static int[] reOrderArray(int[] array) {
int left = 0;
int right = array.length - 1;
while (left < right) {
while (left < right && array[left] % 2 == 1) {
left++;
}
while (left < right && array[right] % 2 == 0) {
right--;
}
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
return array;
}
情况二
保证奇数和奇数,偶数和偶数之间的相对位置不变。
(1)新建一个数组,时间复杂度为O(n),空间复杂度为O(n)
public static int[] reOrderArray(int[] array) {
int[] result = new int[array.length];
int j = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
result[j] = array[i];
j++;
}
}
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
result[j] = array[i];
j++;
}
}
return result;
}
(2)利用插入排序的思想,时间复杂度为O(n^2),空间复杂度为O(1)
public void reOrderArray(int [] array) {
for(int i=1;i<array.length;i++){
if(array[i]%2==1){
int tmp=array[i];
int j=i-1;
while(j>=0 &&array[j]%2==0){
array[j+1]=array[j];
j--;
}
array[j+1]=tmp;
}
}
}