首先这个题目有一个点要注意,就是不能更换同类型数据之间的相对顺序。如果没有这个限制的话,我们的代码可以使用两个指针分别从最左和最右向中间靠拢,然后遇到不符合的相互交换即可,代码如下:
public class Solution {
public void reOrderArray(int [] array) {
int left = 0, right = array.length - 1;
while(left < right) {
for(;left < right && array[left]%2 == 1; left++); //遇到第一个偶数
for(;right > left && array[right]%2 == 0; right--); //遇到第一个奇数
if(left >= right) //如果已经会和了,直接返回
return;
swap(array, left++, right--); //否则交换两个位置,然后更改指针
}
}
private void swap(int[] array, int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
但是题目中是要求不能更改相对顺序的,那么该如何来做呢?我们可以参考插入排序的思路,就是维持一个指针left
始终指向最后一个奇数,然后另一个指针从它的后面出发,直到找到一个奇数,然后逐个的去挪动,因为这两个指针之间的数据肯定都是偶数的。代码如下:
public void reOrderArray(int [] array) {
int left = -1, right = left+1;
while(left < array.length) {
right = left+1; //每次right从left的后面出发
for(; right < array.length && array[right]%2 == 0; ++right); //找打一个奇数
if(right == array.length) return; //如果到头了,则返回
int temp = array[right]; //记录下那个奇数
for(int i = right; i > left+1; --i) array[i] = array[i-1]; //开始移动数据
array[++left] = temp; //将找到的奇数放在left后面,并更新left
}
}