本文參考自《劍指offer》一書,代碼采用Java語言。
題目
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的后半部分。
思路
對於任意一個整數數組,設置一個指針,從前往后走,如果遇到奇數則指針后移,遇到偶數時,希望把該偶數放在數組后面;因此,再設置一個指針,從后往前走,遇到偶數時指針前移,遇到奇數時,則恰好可以與前面的指針所指的偶數進行調換。
測試算例
1.功能測試(數組中奇偶數交替出現;數組中先奇數后偶數;數組中先偶數后奇數)
2.特殊測試(null,空數組,一個數據的數組)
完整Java代碼
(含測試代碼)
package _21;
import java.util.Arrays;
/**
*
* @Description 調整數組順序使奇數位於偶數前面
*
* @author yongh
* @date 2018年10月11日 上午10:12:01
*/
//題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有
//奇數位於數組的前半部分,所有偶數位於數組的后半部分。
public class ReorderArray {
public void reOrderArray(int [] array) {
if(array==null || array.length==0)
return;
int length = array.length;
int low=0;
int high=length-1;
int temp;
while(low<high){
//向后移動low指針,直到它指向偶數
while(low<length && (array[low]&1)!=0)
low++;
//向前移動high指針,直到它指向奇數
while(high>=0 && (array[high]&1)==0)
high--;
if(low<high){
temp=array[low];
array[low]=array[high];
array[high]=temp;
}
}
}
//===============測試代碼===================
void test1() {
int[] array = null;
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test2() {
int[] array = {};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test3() {
int[] array = {-2,4,-6,1,-3,5};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test4() {
int[] array = {-1,3,-5,2,-4,6};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test5() {
int[] array = {-1,2,-3,4,-5,6};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test6() {
int[] array = {2,2,1,3,4,1};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
void test7() {
int[] array = {1};
System.out.println("原始數組:"+Arrays.toString(array));
reOrderArray(array);
System.out.println("調整結果:"+Arrays.toString(array));
System.out.println();
}
public static void main(String[] args) {
ReorderArray demo = new ReorderArray();
demo.test1();
demo.test2();
demo.test3();
demo.test4();
demo.test5();
demo.test6();
demo.test7();
}
}
test1 passed! test2 passed! test3 passed! test4 passed! test5 passed! test6 passed!
附加要求
如果題目附加要求:保證調整后的數組中,奇數和奇數之間,偶數和偶數之間的相對位置不變。
此時用上面的方法就沒法實現該功能,可以采用類似於“直接插入排序”的方法:從頭開始遍歷,遇到奇數時,將該奇數插入到該奇數前面的偶數之前。(如:從頭開始遍歷246183,遇到奇數1時,將1插入到246之前,變為:124683;該插入的實質是:奇數前面的所有偶數往后移一位,空出的位置放入該奇數),具體實現方法見下面的代碼:
/*
* 附加要求:保證調整后的數組中,奇數和奇數之間,偶數和偶數之間的相對位置不變。
* 采用類似直接插入排序算法
*/
public void reOrderArray2(int [] array) {
if(array==null || array.length==0)
return;
int length = array.length;
int temp,j;
for(int i=1;i<length;i++) {
if((array[i]&1)!=0) {
j=i;
temp=array[j];
while((j>0)&&(array[j-1]&1)==0) {
array[j]=array[j-1];
j--;
}
array[j]=temp;
}
}
}
收獲
學會靈活應用指針。
