劍指offer:13 調整陣列中的偶數到奇數後面
阿新 • • 發佈:2018-12-30
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; }