1. 程式人生 > >劍指offer:13 調整陣列中的偶數到奇數後面

劍指offer:13 調整陣列中的偶數到奇數後面

1 冒泡解法 穩定

2 輔助陣列 穩定

3 兩個指標 不穩定

#include <iostream>
#include <vector>
using namespace std;
class solution
{
public:
    //冒泡解法
    void reOerderArray(vector<int> &array){
        if (array.size() == 0) {
            return ;
        }
        bool label = false;
        for (int i = 0; i < array.size(); i++) {
            for (int j = array.size() - 1; j > i; j--) {
                if ((array[j] % 2 == 1) && (array[j-1] % 2 == 0)) {
                    int temp = array[j];//前偶後積就交換
                    array[j] = array[j-1];
                    array[j-1] = temp;
                    label = true;
                    cout << label << endl;
                }
            }
        if (label == false){
            break;
        }
        }


    }

    //輔助陣列完成
    void reOerderArray2(vector<int> &array){
        if (array.size() == 0) {
            return ;
        }
        vector<int> temp;
        vector<int> tp;//兩個空陣列
        for (int i = 0; i < array.size(); i++) {
            if (array[i] % 2 == 0) {
                temp.push_back(array[i]);

            }
        }

        for (int i = 0; i < array.size(); i++) {
            if (array[i] % 2 == 1) {
                tp.push_back(array[i]);
            }
        }

        for (int j=0 ; j < temp.size(); j++) {
            tp.push_back(temp[j]);
        }

        int m = 0, q = 0;
        while (tp[q]) {
            array[m++] = tp[q++];//壓回原陣列
        }
    }

    void reOerderArray3(vector<int> &array){
        if (array.size() == 0) {
            return ;
        }
        vector<int> temp;
        vector<int>::iterator ib1, ie1;//迭代器
        ib1 = array.begin();
        ie1 = array.end();
        for (; ib1 != ie1;) {
            if (*ib1 % 2 == 0) {
                temp.push_back(*ib1);//偶數壓入空陣列
                ib1 = array.erase(ib1);//刪除偶數
            }
            else {
                ib1++;
            }
        }
        vector<int>::iterator ib2, ie2;
        ib2 = temp.begin();
        ie2 = temp.end();
        for (; ib2 != ie2; ib2++) {
            array.push_back(*ib2);//偶數放回原陣列後面
        }

        /*int q = 0;
        while (temp[q]) {
            array.push_back(temp[q++]);
        }*/



    }

    //兩個指標比較,但是不穩定,數度快
    void reOerderArray4(vector<int> &array){
        if (array.size() == 0) {
            return ;
        }
        vector<int>::iterator left, right;//迭代器
        left = array.begin();
        right = array.end() - 1;

        while(left < right) {
            while (left < right && (*left & 0x01) == 1){
                left++; //是奇數後移
            }
            //執行條件是現在已是偶數,等著下邊移到奇數
            while (left < right && (*right & 0x01) == 0){
                right--; // 是偶數前移
            }
            //執行條件是前邊是偶數,後邊是奇數
            if (left < right) {
                int temp = *left;
                *left = *right;
                *right = temp;
            }

        }

    }




};

int main()
{
    int a1[] = { 5, 7 , 6, 3, 9, 8};
    vector<int> vec(a1, a1 + 6);
    solution s;
    s.reOerderArray4(vec);
    for (int i = 0; i < vec.size(); i++){
        cout << vec[i] << endl;
    }

    return 0;
}