第一个思路是借助辅助空间直接先将奇数筛选下来,再筛选偶数
第二个思路是用排序中的思路,问题转视作将奇数的元素尽可能往前面移动,直至到开头或者遇到其他奇数元素(即前面的已经是奇数群体),可以插排也可以冒泡排移动元素
第三个思路是用vector动态调整将偶数都取出然后尾插

#include <iostream>
#include <vector>
using namespace std;
class Solution { //辅助空间
public:
    void reOrderArray(vector<int> &array) {
        vector<int> v;
        for(auto it:array){
            if((it)%2 != 0){
                v.push_back(it);
            }
        }
        for(auto it:array){
            if((it)%2 == 0){
                v.push_back(it);
            }
        }
        for(int i=0;i<array.size();++i){
            array[i] = v[i];
        }
        return ;
    }
};
class Solution2 { //借鉴插入排序,奇数往前部移直至遇到奇数停止
public:
    void reOrderArray(vector<int> &array) {
       for(int i=0;i<array.size();++i){
           if(array[i]%2!=0){
               int j=i-1;
               int tempt=array[i];
               while((j>=0)&&(array[j]%2==0)){
                   array[j+1]=array[j];
                   j--;
               }
               array[j+1] = tempt;
           }
       }
    }
};

vector有两个注意的:
1.动态调整vector还要遍历,变量不能按vector的元素遍历,可能死循环也可能访问非法(调整后it的指向未知并不一定顺延下去),自己手动技术size次。
2.先察除(当然要先存好副本),再插入而不能先插入副本再删除(估计是插入的时候vector就变了it指向也变了),同时得用it=v.erase(it)(无法解释为什么先删除再插入删除的返回it还能用,反正是实测踩坑)

class Solution3 { //vector偶数动态倒插法
public:
    void reOrderArray(vector<int> &array) {
        vector<int>::iterator it = array.begin();
        for(int i=0;i<array.size();++i){
            if(*it%2==0){
                int tempt = *it;
                it = array.erase(it);             //顺序反了就不行????
                array.push_back(tempt);
            }else{
                it++;                            //记得没成功的也有指针后移
            }
        }
    }
};
int main(){
    vector<int> v={1, 2,3,4, 5, 6, 7};
    Solution3 s;
    s.reOrderArray(v);
    for(int i=0;i<v.size();++i)
        cout<<v[i]<<" ";

}