调整数组顺序使奇数位于偶数前面(一):最直观的想法是,如果是仅仅调整数组顺序使奇数位于偶数前面,那么就使用双指针,一个指针从前往后遍历寻找数组中的偶数,一个指针从后往前遍历寻找数组中的奇数,然后交换两者,但是题目中要求保证奇数和奇数、偶数和偶数之间的相对位置不变,那么双指针的想法就有点不可行了,于是就想到从前往后遍历数组,奇数就存在odd数组中,偶数就存在even数组中,然后再将even数组追加到odd数组后面,并返回odd数组即可。

vector<int> reOrderArray(vector<int>& array) {
        vector<int> odd;
        vector<int> even;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2!=0)
                odd.push_back(array[i]);
            else
                even.push_back(array[i]);
        }
        for(int j=0;j<even.size();j++)
        {
            odd.push_back(even[j]);
        }
        return odd;
    }

优化:那到底能不能不使用额外空间而直接在原数组上修改呢?使用变量i表示奇数放好的下一个位置,最开始i=0表示没有一个奇数,j表示数组的下标,对数组进行遍历。具体做法是,如果遇到偶数则j++,如果遇到奇数则将[i,j-1]的数组整体后移一位接着将j位置的奇数插入到i的位置然后将i后移一位,直到整个数组遍历结束。

vector<int> reOrderArray(vector<int>& array) 
{
    int i=0;
    for(int j=0;j<array.size();j++)
    {
        if(array[j]%2==1) //遇到奇数
        {
            int temp=array[j];
            //将[i,j-1]数组后移
            for(int k=j-1;k>=i;k--)
            {
                array[k+1]=array[k];
            }
            array[i]=temp;
            //i后移一位
            i++;
         }
    }
    return array;
}