题意思路:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

方法一:暴力枚举

遍历一遍数组顺序,使数组中奇数分为一类,偶数分为一类,最后将奇数位于偶数前面

复杂度分析

时间复杂度:O(N),N数组的长度,遍历数组;

空间复杂度:O(N),数组存储与读取数据。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArray(vector<int>& array) {
        // write code here
        vector<int>evenArray;
        vector<int>oddArray;
        vector<int>res;
        for(int i:array){
            if(i&1){//使数组中奇数分为一类,偶数分为一类
                oddArray.push_back(i);
            }
            else evenArray.push_back(i);
        }

        for(int i:oddArray)res.push_back(i);//最后将奇数位于偶数前面
        for(int i:evenArray)res.push_back(i);
        return res;
    }
};

方法二:双指针
创建双指针i和j

i = 0表示没有一个奇数,j 表示数组的下标,对数组进行遍历

若指针j指向偶数继续遍历

若指针j指向奇数则整体偶数向后移动,将该奇数赋值给i指针位置,i++,j++。

图解:
图片说明

复杂度分析

时间复杂度:O(N^2),N数组的长度,遍历数组,整体后移最坏情况下时间复杂度N^2;

空间复杂度:O(1),未开辟新空间

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArray(vector<int>& array) {
        // write code here
        int i=0,j=0;//i表示奇数,j表示数组当前下标
        for(;j<array.size();){
            if((array[j]&1)==0)j++;//若为偶数指针j后移
            else{//若为奇数
                int tmp=array[j];
                for(int k=j-1;k>=i;k--){//将前面的偶数向后移动
                    array[k+1]=array[k]; 
                }   
                array[i++]=tmp; //将奇数调换到i处
                j++;
            }
        }
        return array;
    }
};