1. 程式人生 > >劍指offer- 調整陣列順序使奇數位於偶數前面(陣列)

劍指offer- 調整陣列順序使奇數位於偶數前面(陣列)

題目描述

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

看著這個題目,想到的是排序演算法。(推薦這個)

以及利用空間換時間,新建陣列的演算法。

先說這個新建陣列的演算法,思路簡單。就是將奇數和偶數分別計算出來放在新的數組裡,再把新的陣列給舊陣列。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> a,b;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2!=0)
                a.push_back(array[i]);
            else
                b.push_back(array[i]);
        }
        a.insert(a.end(),b.begin(),b.end());
        array=a;
    }
};

這裡時間複雜度是O(n),空間複雜度也是O(n)。就是利用消耗空間來換取時間。但是後來想到,既然題目用到了引用,應該是希望我們儘量在原陣列array上進行修改,所以比較推薦排序演算法。

方法二:插入排序

題目中提到相對位置不變,因此考慮用的是插入排序的思想。

當這個數是奇數時,記錄在temp中,如果前面有偶數,就往這個數前插入。這樣也能保持了原本的順序

這個時間複雜度O(n^2),空間複雜度是O(1)。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        for(int i=1;i<array.size();i++)
        {
            if(array[i]%2==1){
                int temp = array[i];
                int j;
                for(j=i;j>0&&array[j-1]%2==0;j--)
                    array[j]=array[j-1];
                array[j]=temp;
            }
        }
    }
};

後來想到好像還可以用,檢測這個數是否偶數,是偶數就先在陣列中刪除,再在末尾push_back。沒有具體測試過,在Python上應該比較好實現。