题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
快速排序算法可以用来交换奇数和偶数的位置,但它不能保证相对位置不变,因此快速排序方案是不可行的。
第一种思路是使用临时 vector 分别记录奇数和偶数,最后把两个临时 vector 聚合成一个,最后交换聚合的 vector 和原 vector。
第二种思路是借助双指针,第一个指针指向当前 vector 的第一个偶数,第二个指针寻找后续的奇数,然后将两个指针之间所有的偶数向后移动一位,最后把奇数放到腾出来的位置上。
实现
//方案一
class Solution {
public:
void reOrderArray(vector<int> &array) {
size_t size = array.size(), i=0;
vector<int> odd, even;
for(; i<size; ++i)
{
if((array[i]&1)==1)
odd.push_back(array[i]);
else
even.push_back(array[i]);
}
//使用了copy算法和插入迭代器
copy(even.begin(), even.end(), back_inserter(odd));
//使用swap交换两个vector
array.swap(odd);
}
};
//方案二
/*
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网
*/
class Solution {
public:
void reOrderArray(vector<int> &array) {
int i = 0;
for (int j=0; j<array.size(); ++j) {
if (array[j]&1) {
int tmp = array[j];
for (int k=j-1; k>=i; --k) {
array[k+1] = array[k];
}
array[i++] = tmp;
}
}
}
};