输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,(《剑指offer》中没有后面这个要求)并保证奇数和奇数,偶数和偶数之间的相对位置不变。
如果按照《剑指offer》的要求,解法如下:
public class Solution {
public void reOrderArray(int [] array) {
if(null==array) return ;
int start=0;
int end=array.length-1;
while(start<end){
while((start<end)&(array[start]&1)!=0){
start++;
}
while((start<end)&(array[end]&1)!=1){
end--;
}
if(start<end){
int temp=array[start];
array[start]=array[end];
array[end]=temp;
}
}
}
}
如果加上加粗部分的要求,有两种思路,分别为:
解法一 : (代码一目了然,无须解释)
public class Solution {
public void reOrderArray(int [] array) {
if(array==null) return;
int[] odd=new int[array.length];
int[] even=new int[array.length];
int pos1=0;
int pos2=0;
for(int i=0;i<array.length;i++){
if((array[i]&1)==0){
even[pos1]=array[i];
pos1++;
}else{
odd[pos2]=array[i];
pos2++;
}
}
for(int i=0;i<pos2;i++){
array[i]=odd[i];
}
for(int i=0;i<pos1;i++){
array[i+pos2]=even[i];
}
}
}
解法二: (用冒泡排序的思想)
public class Solution {
public void reOrderArray(int [] array) {
if(array==null) return;
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-1;j++){
if(isEven(array[j])&&!isEven(array[j+1])){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
static boolean isEven(int n){
if((n&1)==0) return true;
return false;
}
}