【Java】 劍指offer(21) 調整數組順序使奇數位於偶數前面

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目

  輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部奇數位於數組的前半部分,全部偶數位於數組的後半部分。算法

思路

  對於任意一個整數數組,設置一個指針,從前日後走,若是遇到奇數則指針後移,遇到偶數時,但願把該偶數放在數組後面;所以,再設置一個指針,從後往前走,遇到偶數時指針前移,遇到奇數時,則剛好能夠與前面的指針所指的偶數進行調換。數組

測試算例 ide

  1.功能測試(數組中奇偶數交替出現;數組中先奇數後偶數;數組中先偶數後奇數)函數

  2.特殊測試(null,空數組,一個數據的數組)post

完整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!
ReorderArray

 

附加要求

  若是題目附加要求:保證調整後的數組中,奇數和奇數之間,偶數和偶數之間的相對位置不變。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;
    		}
    	}
    }

  

收穫

  學會靈活應用指針。

  

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索