题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析
我们先来看看无需考虑相对位置不变这个因素,需要设置两个指针low,high,分别向中间移动寻找,如果左半部分出现偶数,右半部分出现奇数,就调换一下。
1、不考虑相对位置不变
public class Solution {
public void reOrderArray(int [] array) {
if(array == null || array.length == 0){
return ;
}
int low = 0;
int high = array.length - 1;
int temp;
while(low <= high){
//奇数
while(low <= high && array[low] % 2 == 1 ){
low++;
}
//偶数
while(low <= high && array[high] % 2 == 0){
high--;
}
if(low < high){
temp = array[low];
array[low] = array[high];
array[high] = temp;
}
}
}
}
2、考虑相对位置不变条件(本题)
加上这个条件,就稍微没那么容易了。
思路:算法类似冒泡排序,前偶后奇就调换位置,这样一次数组循环能排好一个偶数和一个奇数,一共进行n次,总体的时间复杂度为O(nlogn)
public class Solution {
public void reOrderArray(int [] array) {
for(int i = 0 ; i < array.length - 1 ; i++){
for(int j = 0 ; j < array.length - 1 - i ; j++){
if(array[j] % 2 == 0 && array[j+1] % 2 == 1){
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
}