问题:输入一个整数数组,实现一个函数来调整该数组中数字元素的顺序,使得所有的奇数位于数组的前半部分,所有的偶数都位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置保持不变。
思路:
1.简单点的方法,就是用两个循环,先从头挑选奇数存到vector,在从头挑选偶数存到vector.
具体代码:(C++)
class Solution
{
public:
void reOrderArray(vector<int> &array)
{
int length = array.size();
if(length <= 1)
return ;
vector<int> res;
for(int i=0;i<length; i++)
{
if((array[i] & 0x1) != 0) //奇数
res.push_back(array[i]);
}
for(int i=0; i < length; i++)
{
if((array[i] & 0x1) == 0) //偶数
res.push_back(array[i]);
}
array = res;
}
};
2.复杂一点的方法是,逐个判断,将第一个偶数和其后的第一个奇数交换位置,偶数依次往后移,依次循环,直到排序完成。类似插入排序算法。
具体代码:(C++)
class Solution
{
public:
bool isEven(int num) //判断是否为偶数
{
if((num & 0x1) == 0)
return true;
return false;
}
void reOrderArray(vector<int> &array)
{
int length = array.size();
if(length <= 1)
return ;
int index_even = 0; //偶数的索引
int index_odd; //奇数的索引
while(index_even < length)
{
while (index_even <length && !isEven(array[index_even]) //如果是奇数
++index_even;
//跳出上面while循环说明找到了第一个偶数
index_odd = index_even + 1;
while(index_odd < length && isEven(array[index_odd)) //如果是偶数
++index_odd;
//跳出上面while循环说明找到了偶数后的第一个奇数,再将偶数和奇数位置移动一下
if(index_odd < length)
{
int temp = array[index_odd];
for(int i = index_odd; i>index_even; i-- )
{
array[i] = array[i-1]; //将偶数依次后移
}
array[index_even] = temp;
}
else
break;
}
}
};