題目:輸入一個整數數組,實現一個函數,來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
分析:這是一個將數組按照某個二分法標準分成左右兩堆的題目。可以考慮類似快速排序的方法。爲了使程序便於擴展,分類標準採用接口。
/** 將數組調整成左奇右偶
* @param data
*/
public void reOrderOddEven(int[] data){
reOrder(data,new Stantard(){
@Override
public boolean isSthByStandard(int n) {
// TODO 自動生成的方法存根
return (n&0x1)==0;//偶數返回true,奇數返回false
}});
}
/**
* 分類標準
*/
public interface Stantard{
boolean isSthByStandard(int n);
}
/**類似於快速排序(小於樞軸元素放左邊,大於樞軸元素放右邊),該函數按條件將元素劃分成兩部分,一些放左邊,一些放右邊
* @param data
*/
public void reOrder(int[] data,Stantard standard){
int first=0,last=data.length-1;
while(true){
while((first<last)&&!standard.isSthByStandard(data[first]))//左邊
first++;
while((first<last)&&standard.isSthByStandard(data[last]))//右邊
last--;
if(first>=last)
break;
swap(data,first++,last--);
}
}
/** 交換數組中兩個元素的位置
* @param data
* @param i
* @param j
*/
private void swap(int[] data, int i, int j) {
// TODO 自動生成的方法存根
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}