本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部奇數位於數組的前半部分,全部偶數位於數組的後半部分。算法
對於任意一個整數數組,設置一個指針,從前日後走,若是遇到奇數則指針後移,遇到偶數時,但願把該偶數放在數組後面;所以,再設置一個指針,從後往前走,遇到偶數時指針前移,遇到奇數時,則剛好能夠與前面的指針所指的偶數進行調換。數組
測試算例 ide
1.功能測試(數組中奇偶數交替出現;數組中先奇數後偶數;數組中先偶數後奇數)函數
2.特殊測試(null,空數組,一個數據的數組)post
(含測試代碼)測試
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!
若是題目附加要求:保證調整後的數組中,奇數和奇數之間,偶數和偶數之間的相對位置不變。url
此時用上面的方法就無法實現該功能,能夠採用相似於「直接插入排序」的方法:從頭開始遍歷,遇到奇數時,將該奇數插入到該奇數前面的偶數以前。(如:從頭開始遍歷246183,遇到奇數1時,將1插入到246以前,變爲:124683;該插入的實質是:奇數前面的全部偶數日後移一位,空出的位置放入該奇數),具體實現方法見下面的代碼:spa
/* * 附加要求:保證調整後的數組中,奇數和奇數之間,偶數和偶數之間的相對位置不變。 * 採用相似直接插入排序算法 */ 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; } } }
學會靈活應用指針。