【题目】输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
package com.exe3.offer;
/**
* 11【题目】输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
* 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
* 【思路】
* @author WGS
*
*/
//1 2 3 4 5
public class ReOrderOddEven11 {
//方法1:前后两个数比较,若前为偶数后为奇数,即调换两者位置
public int[] getOrder2(int[] arr){
if(arr==null||arr.length==0){
System.out.println("Invalid arrays");
}
int i,j;
for(i=1;i<arr.length;i++){//此处i设为1,方便比较前者
int temp=arr[i];
if(!isEven(i)){//后者为奇数
for(j=i-1;j>=0&&(isEven(j));j--){//此处j设为0,即与i设为1的值比较 前者(j)为偶数
arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}
return arr;
}
//判断是否为偶数
public boolean isEven(int n){
if((n&0x1)==0){
return true;
}
return false;
}
//方法2(较好的方法):前后设置两个指针,当前指针指向的数为偶数,后指针指向的数为奇数时,即调换两个数位置。
public int[] getOrder(int[] arr){
if(arr==null||arr.length==0){
System.out.println("Invalid arrays");
}
int preIndex=0;
int endIndex=arr.length-1;
while(preIndex<endIndex){//要变成奇+偶组合
while(preIndex<endIndex && (arr[preIndex]&0x1)!=0){//是奇数,该数不用换,指针后移
preIndex++;
}
while(preIndex<endIndex && (arr[endIndex]&0x1)==0){//是偶数,该数不用换,指针前移
endIndex--;
}
if(preIndex<endIndex){
int temp=arr[preIndex];
arr[preIndex]=arr[endIndex];
arr[endIndex]=temp;
}
}
return arr;
}
public static void main(String[] args){
ReOrderOddEven11 r=new ReOrderOddEven11();
int[] arr=new int[]{8,1,2,3,4,5};
int[] arr2=r.getOrder(arr);
for(int s:arr2){
System.out.print(s+" ");
}
}
}