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


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

錯誤代碼:

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)的算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM