題目描述:
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的后半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
解題思路:
首先,如果不考慮奇數和奇數,偶數和偶數的相對位置,那么我們有一種雙指針解法來求解,類似於快排,維護兩個指針,第一個指針指向數組的第一個數字,第二個指針指向數組的最后一個數字。第一個指針向后移,第二個指針向前移,如果第一個指針指向偶數,第二個指針指向的是奇數,則交換着兩個數字,接着繼續移動直到兩指針相遇。
上面的方法看似不錯,但是對本題不適用,因為本題有相對位置不變的要求,直接交換會導致相對位置改變。因此,我們采用下面的思路來解決本題。
本題解法:對數組進行遍歷,設置兩個指針even和odd,even指向當前第一個偶數,odd從這個偶數之后開始查找,找到第一個奇數,此時為了相對位置不變,不能直接交換even和odd,而是將從even到odd-1的元素都依次向后移一個位置,將odd指向的那個奇數放到even的位置。然后再找下一個偶數,重復這一過程,最終就可以將奇數都放到偶數的前面,並且保證了相對位置的不變。
編程實現(Java):
public void reOrderArray(int [] array) {
int len=array.length;
int even=0,odd=0; //當前序列的第一個奇數和第一個偶數
while(odd<len && even<len){
while(even<len && array[even]%2!=0) //找到第一個偶數even
even++;
odd=even+1;
//找偶數之后的第一個奇數
while(odd<len && array[odd]%2==0)
odd++;
if(odd>=len) //注意判斷,防止溢出
break;
//把奇數取出來,從even到odd-1的元素都向后移
int temp=array[odd];
for(int i=odd;i>even;i--)
array[i]=array[i-1];
array[even]=temp; //奇數放在原來even的位置
even++;
}
}