调整数组顺序使奇数位于偶数前面(十三)
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
代码(已在牛客上 AC)
先给出一种很直观的做法:
class Solution {
public:
// 类似于插入排序的思路,如果当前元素为奇数而它前面的元素为偶数,
// 那么就将它插到合适的位置
void reOrderArray(vector<int> &array) {
for (int i = 1; i < array.size(); ++i) {
int tmp = array[i];
int j = i - 1;
while (j >= 0 && (tmp % 2 == 1) && (array[j] % 2 == 0)) {
array[j + 1] = array[j];
-- j;
}
array[j + 1] = tmp;
}
}
};
然后对上面的代码进行优化:
令 array[0,....k]
保存奇数, 而后面 array[k + 1, i - 1]
保存偶数(所以 array.begin() + i
相当于 end
. 使用 copy_backward
的原因是, 我看完 STL 中对于 copy_backward
的实现, 如果其中的数据类型是 POD
类型的, 底层是调用 memmove
进行数据的拷贝, 速度会有一些提升, 这个思路是突然想到的, 我机制的一pi(–冯宝宝, 一人之下2)
class Solution {
public:
// 类似于插入排序的思路,如果当前元素为奇数而它前面的元素为偶数,
// 那么就将它插到合适的位置
void reOrderArray(vector<int> &array) {
int k = -1;
for (int i = 0; i < array.size(); ++i) {
if ((array[i] & 1) == 0) continue;
auto tmp = array[i];
copy_backward(array.begin() + k + 1, array.begin() + i, array.begin() + i + 1);
array[++k] = tmp;
}
}
};