描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析
方法1:冒泡排序调换(只是条件变成了奇数和偶数互换)
方法2:临时数组存储(开启临时数组存储偶数,然后原数组删除偶数,最后进行push_back)
方法3:指针调换(该方法不能保证数组的奇偶的相对位置)
方法1
class Solution {
public:
void reOrderArray(vector<int> &array) {
for(int i = 0; i<array.size();i++){
bool isSwap = false;
for(int j = array.size()-1;j>i;j--){
// 奇数和偶数调换
if(array[j]%2==1&&array[j-1]%2==0){
swap(array[j],array[j-1]);
isSwap = true;
}
}
if(!isSwap){
break;
}
}
}
};
方法2
class Solution {
public:
void reOrderArray(vector<int> &array) {
// 创建存储偶数的临时数组
vector<int> array_temp;
// 迭代遍历初始值指针变量
// vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
vector<int> ::iterator begin1;
// 指向第一个值
begin1 = array.begin();
// 遍历查找出偶数 然后放入临时数组
for(;begin1!=array.end();){
if(*begin1 % 2 == 0){
// 偶数加入临时数组
array_temp.push_back(*begin1);
// 原数组移除指定的偶数 不需要进行+1
begin1 = array.erase(begin1);
}
else
{
begin1++;
}
}
vector<int>::iterator begin2,end2;
begin2 = array_temp.begin();
end2 = array_temp.end();
// 临时数组拼接到原数组后面
for(;begin2!=end2;begin2++)
{
array.push_back(*begin2);
}
}
};
注:对应的erase()方法参考链接传送门
方法3(不能保证相对位置,参考一下)
// 这种方法交换的确很快速,但是这种方式不能保证奇数和偶数的相对位置
// 例如 1234567 ---> 1735462 但是结果需要的输出是保证相对位置不变 1357246
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> ::iterator left = array.begin();
vector<int> ::iterator right = array.end()-1;
while(left<right){
// 指向第一个偶数
while(left<right && (*left && 0x01)==1){
left++;
}
// 指向第一个奇数
while(left<right && (*right && 0x01)==0){
right--;
}
if(left<right){
swap(*left,*right);
}
}
}
};