输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解法1: 从头到尾扫描数组,遇到偶数就取出来,把偶数后面的数字往前挪,偶数填在最后面。
时间复杂度O(n²),空间复杂度O(1)。
解法2: 开一个新数组从头到尾扫描,东西存新数组里。时间复杂度O(n),空间复杂度O(n)。
解法3: 交错扫描,定义下标i和j,分别从开头和结尾开始扫描,空间复杂度是O(1),时间复杂度O(n)。
- 当i遇到偶数时,停止扫描
- 当j遇到奇数时,停止扫描
- 此时交换i和j位置的值
- 继续前面的操作,直到i和j交错或相等
void reOrderArray(vector<int> &array) {
if(array.size() == 0) return;
int i = 0;
int j = array.size() - 1;
while(1){
// i遇到偶数停止,j遇到奇数停止
while(1 == (array[i]) & 1){
i++;
}
while(0 == (array[j]) & 1){
j++;
}
if(i < j){
swap(array[i], array[j]);
}else{
break;
}
}
}