題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的后半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
錯誤代碼:
public class Solution { public void reOrderArray(int [] array) { int len=array.length; for(int i=0;i<len;i++){ if((array[i]&1)==0){ int j; for(j=i;j<len-1;j++) array[j]=array[j+1]; int temp; temp=array[i]; array[j]=temp; i--; } } } }
這段代碼,i-- 這個語句,會導致死循環。因為,到了數組某一階段,i及其以后全是偶數,會一直循環,而且破壞穩定性。
改正:
public class Solution { public void reOrderArray(int [] array) { int len=array.length; int k=0; for(int i=0;i<len-k;i++){ int temp; temp=array[i]; if((array[i]&1)==0){ int j; for(j=i;j<len-1;j++) array[j]=array[j+1]; array[j]=temp; i--; k++; } } } }
這段代碼,增加一個k,限制i的循環次數。關鍵是,i不需要遍歷到最后。另外,如果想要讓奇數向前,可以仿照上述代碼,從后面遍歷。
再有,完全仿照直接插入排序,奇數向前,同時從0遍歷,注意一點:找到奇數后,要從第一個偶數開始向后搬運,再將奇數插入到原來第一個偶數的位置。
public class Solution { public void reOrderArray(int [] array) { int len=array.length; for(int i=0;i<len;i++){ if((array[i]&1)==1){ int k=0; while((array[k]&1)==1&&k<i) k++; //找到前面第一個偶數 if(k<i){ int temp=array[i]; int j; for(j=i;j>k;j--) array[j]=array[j-1]; array[j]=temp; } } } } }
以上的時間復雜度是O(n²),如果再借用一個數組,將偶數放進去,然后再復制到原來的數組中,可實現時間復雜度為O(n)的算法