劍指Offer:面試題14——調整陣列順序使奇數位於偶數前面(java實現)
阿新 • • 發佈:2019-01-07
問題描述
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。
思路:
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來考慮下:如果我們要求不能改變原始陣列中元素的相對位置(奇數與奇數的相對位置,偶數與偶數的),該怎麼做?(暫時還沒想到好的方法)