1. 程式人生 > >劍指Offer:面試題14——調整陣列順序使奇數位於偶數前面(java實現)

劍指Offer:面試題14——調整陣列順序使奇數位於偶數前面(java實現)

問題描述

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。

思路:

1.最簡單的想法,不考慮時間複雜度,掃描陣列,遇到偶數,先取出這個數,然後把它後面的數字都往前面移動一位,這樣最後空出一位放該偶數即可。但顯然這樣會重複移動很多次。時間複雜的O(n^2)
2.在前後安排兩個哨兵i,j,前面的用來指示偶數(即掃描如果是奇數就往後走),後面的用來指示奇數(遇到偶數就往前面走),當i掃描到偶數而j掃描到奇數時,我們就將其交換。類似掃描下去直到i,j相遇。但是該方法會改變原始元素的相對位置。
3.(具有可擴充套件性的解法)
如果題目改成:把陣列中的數按照大小分為兩部分,所有負數都在非負數的前面,該怎麼做?當然我們改變2中的判斷條件即可。那麼是否可以用一種可擴充套件 的方法能解決這一類問題呢?
當然可以。我們只要把判斷部分換成一個通用的函式即可。(具體參考劍指Offer——105頁)

思路1程式碼:

    public void reOrderArray(int [] array) {
        if(array == null || array.length == 0){
            return;
        }

        int n = array.length;
        int count = 0;

        for(int i = 0; i < n && count < n; i++){
            count++;
            int a = array[i];
            if
(a % 2 == 0){ for(int j = i; j < n-1; j++){ array[j] = array[j+1]; } array[n-1] = a; i--; } } }

思路2程式碼:

//未考慮元素的相對位置不變
public void reOrderArray(int [] array) {
        if(array == null || array
.length == 0){ return; } int i = 0; int j = array.length - 1; while(i<j){ while(i<j && array[i]%2 != 0){ i++; } while(i<j && array[j]%2 == 0){ j--; } if(i < j){ int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } }

現在我們要針對思路2來考慮下:如果我們要求不能改變原始陣列中元素的相對位置(奇數與奇數的相對位置,偶數與偶數的),該怎麼做?(暫時還沒想到好的方法)