劍指offer- 調整陣列順序使奇數位於偶數前面(陣列)
阿新 • • 發佈:2018-12-13
題目描述
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
看著這個題目,想到的是排序演算法。(推薦這個)
以及利用空間換時間,新建陣列的演算法。
先說這個新建陣列的演算法,思路簡單。就是將奇數和偶數分別計算出來放在新的數組裡,再把新的陣列給舊陣列。
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上應該比較好實現。