题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
最简单的想法,不考虑时间复杂度,从头扫描这个数组,每碰到一个偶数时,先取出这个数,然后把它后面的数字都往前面移动一位,这样最后空出一位放该偶数即可。但显然这样会重复移动很多次,这种解法显然是O(n^2)的。
其实,数组类的排序问题,尤其是这种分为两部分的,我们都可以借鉴快排思想。 但是快排是不稳定的,而此题目要求相对位置不变。因此,要想保证原有次序,则只能顺次移动或相邻交换。
1. begin从左向右遍历,找到第一个偶数;
2. from从begin+1开始向后找,直到找到第一个奇数;
3. 将[begin,…,from-1]的元素整体后移一位;
4. 将找到的奇数放入begin位置,然后begin++。
实现代码
public class Solution {
public void reOrderArray(int [] array) {
if(array == null || array.length == 0)
return;
int begin = 0, from;
while (begin < array.length) {
while (begin < array.length && array[begin] % 2 != 0) { //begin从左向右遍历,找到第一个偶数
begin++;
}
from = begin + 1;
while (from < array.length && array[from] % 2 == 0) { //from从begin+1开始向后找,直到找到第一个奇数
from++;
}
if (from < array.length) { //将[begin,…,from-1]的元素整体后移一位
int temp = array[from];
for (int i = from - 1; i >= begin; i--) {
array[i + 1] = array[i];
}
array[begin++] = temp; //将找到的奇数放入begin位置,然后begin++
} else {
break;
}
}
}
}