49.调整数组使奇数位于偶数的前面(129)
- 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 思路:对于数组,如果不开辟新的空间,那就只能在数组中移动元素。对于移动元素,我们可以将奇数往前移动,也或者将偶数往后移动。这样也可以保证 奇数以及偶数内部的稳定性。但是平均时间复杂度都为O(n^2),具体实现如下。可以采用快排的思想,时间复杂度为O(nlogn),但是此方法不能保证奇数以及偶数内部的稳定性 。
- 代码:
package _49.调整数组使奇数位于偶数的前面;
import java.util.Arrays;
public class ReOrderArray {
public static void reOrderArray1(int [] array) {
if(array == null || array.length == 0) return;
int tmp = 0;
int k = 0;
for(int i = 0; i < array.length; i++){
if(array[i] % 2 == 1){
for(int j = i; j > k;j--){
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
k++;
}
}
}
public static void reOrderArray2(int [] array) {
if(array == null || array.length == 0) return;
int tmp = 0;
int k = 0;
int i = 0;
while(i < array.length - k){
if(array[i] % 2 == 0){
tmp = array[i];
for(int j = i+1; j < array.length; j++){
array[j-1] = array[j];
}
array[array.length - 1] = tmp;
k++;
}
else{
i++;
}
}
}
public static void reOrderArray3(int [] array) {
if(array == null || array.length == 0) return;
int begin = 0;
int end = array.length - 1;
while(begin < end){
while(array[begin] % 2 == 1 && begin < end)
begin++;
while(array[end] % 2 == 0 && begin < end)
end--;
if(begin < end){
int sum = array[begin] + array[end];
array[begin] = sum - array[begin];
array[end] = sum - array[begin];
}
}
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
reOrderArray3(array);
System.out.println(Arrays.toString(array));
}
}