1. 程式人生 > >數組中,奇數放前偶數放後

數組中,奇數放前偶數放後

增加 oid clas 復雜度 想要 調整 次數 blog 數組

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

錯誤代碼:

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(n2),如果再借用一個數組,將偶數放進去,然後再復制到原來的數組中,可實現時間復雜度為O(n)的算法

數組中,奇數放前偶數放後