【问题】输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
【思路】首先我们很快会想到使用辅助数组,分别统计奇数和偶数,然后再将这两个数组合并起来!注意一点,我们不需要去建立两个数组,只使用一个数组就好,奇数数组可以使用原数组!
1class Solution { 2public: 3 void reOrderArray(vector<int> &array) { 4 vector<int> even(array.size()); 5 int i = 0, j = 0; // i为原数组索引,j为辅助数组索引 6 for(auto num: array){ 7 if((num & 1) == 1){ 8 array[i++] = num; 9 }else{ 10 even[j++] = num; 11 } 12 } 13 for(int k=0;k < j; k++){ 14 array[i++] = even[k]; 15 } 16 } 17};
那我们能不是不使用额外的空间复杂度呢?当然可以,由于题目要求奇数和偶数的相对顺序保持不变,也就是排序的稳定性,而经过我们之前对常用排序算法的了解,知道插入排序是稳定的!因此我们可以遍历整个数组,如果为奇数,则与其前面的所有偶数交换位置,这样也可以达到我们的目的!
1class Solution { 2public: 3 // 类似于插入排序的方法,将奇数依次的插入到偶数的前面 4 void reOrderArray(vector<int> &array) { 5 for(int i = 0;i < array.size(); ++i){ 6 if((array[i] & 1) == 1){ // 如果当前值为奇数 7 for(int j = i-1; j >=0; j--){ 8 if((array[j] & 1) == 0){ // 遍历i的前面,如果为偶数,则交换 9 swap(array[j], array[j+1]); 10 } 11 } 12 } 13 } 14 } 15};