演算法學習記錄十一(C++)--->調整陣列順序使奇數前偶數後

Deft_MKJing宓珂璟發表於2017-08-24

描述

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

分析

方法1:氣泡排序調換(只是條件變成了奇數和偶數互換)
方法2:臨時陣列儲存(開啟臨時陣列儲存偶數,然後原陣列刪除偶數,最後進行push_back)
方法3:指標調換(該方法不能保證陣列的奇偶的相對位置)

方法1

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        for(int i = 0; i<array.size();i++){
            bool isSwap = false;
            for(int j = array.size()-1;j>i;j--){
            // 奇數和偶數調換
                if(array[j]%2==1&&array[j-1]%2==0){
                    swap(array[j],array[j-1]);
                    isSwap = true;
                }
            }
            if(!isSwap){
                break;
            }
        }
    }
};

方法2

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        // 建立儲存偶數的臨時陣列
       vector<int> array_temp;
        // 迭代遍歷初始值指標變數
        // vector<int>::iterator iter;這條語句定義了一個名為iter的變數,它的資料型別是由vector<int>定義的iterator型別。
       vector<int> ::iterator begin1;
        // 指向第一個值
        begin1 = array.begin();
        // 遍歷查詢出偶數 然後放入臨時陣列
        for(;begin1!=array.end();){
            if(*begin1 % 2 == 0){
                // 偶數加入臨時陣列
                array_temp.push_back(*begin1);
                // 原陣列移除指定的偶數 不需要進行+1
                begin1 = array.erase(begin1);
            }
            else
            {
                begin1++;
            }
        }

        vector<int>::iterator begin2,end2;
        begin2 = array_temp.begin();
        end2 = array_temp.end();
        // 臨時陣列拼接到原陣列後面
        for(;begin2!=end2;begin2++)
            {
            array.push_back(*begin2);
        }

    }
};

注:對應的erase()方法參考連結傳送門

方法3(不能保證相對位置,參考一下)

// 這種方法交換的確很快速,但是這種方式不能保證奇數和偶數的相對位置
// 例如 1234567 ---> 1735462  但是結果需要的輸出是保證相對位置不變 1357246  
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> ::iterator left = array.begin();
        vector<int> ::iterator right = array.end()-1;
        while(left<right){
            // 指向第一個偶數
            while(left<right && (*left && 0x01)==1){
                left++;
            }
            // 指向第一個奇數
            while(left<right && (*right && 0x01)==0){
                right--;
            }
            if(left<right){
                swap(*left,*right);
            }
        }


    }
};

相關文章