方法一:两次遍历

1.结题思路

简单题,两次遍历原始数组,分别将奇偶数按序加入结果数组

2.解法

遍历两次array数组,第一次遍历时,将所有奇数数组元素加入ans数组,第二次遍历时,将所有偶数数组元素加入ans数组

3.图解

图片说明

4.具体代码

vector<int> reOrderArray(vector<int>& array) {
    vector<int>ans;
    for(auto it=array.begin();it!=array.end();it++){
        if(*it&1)ans.push_back(*it);
    }
    for(auto it=array.begin();it!=array.end();it++){
        if(*it%2==0)ans.push_back(*it);
    }
    return ans;
}

5.时间复杂度和空间复杂度分析

时间复杂度:O(n),n是数组元素个数,仅遍历了两次数组。
空间复杂度:O(n),n是数组元素个数,用到了一维数组。

方法二:移动数组元素

1.结题思路

有点类似插入排序的思想,数组分成两部分,前半部分放我们已经处理好的调到前面来的奇数,后半部分放偶数,每次将奇数插入已排列好的奇数尾部。

2.解法

首先用一个变量pre保存已经移动到数组前部的奇数的下一个存放位置的下标,接着用变量temp临时保存一个这个奇数,并将前面所有的偶数后移一位,最后将temp所保存的奇数填入ans[pre],并更新pre++

3.图解

图片说明

4.具体代码

/*vector<int> a;
  for(int i=0;i<10;i++)
  a[i]=i;
这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素;而现在的a[i]还是空的对象*/
vector<int> reOrderArray(vector<int>& array) {
    vector<int>ans(array);//用array来定义ans; 
    int pre=0;
    for(int i=0;i<array.size();i++){
        if(array[i]&1){
            int temp=array[i];
            for(int j=i;j>pre;j--){
                ans[j]=ans[j-1];
            }
            ans[pre++]=temp;
        } 
    }
    return ans;
}

5.时间复杂度和空间复杂度分析

时间复杂度:O(n^2),n是数组元素个数,类比插入排序,平均情况O(n^2)。
空间复杂度:O(n),n是数组元素个数。