题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:
遍历所有的数,将所有的奇数放入一个容器中,将所有的偶数放入一个容器中,最后用这些奇数偶数代替原来的元素
class Solution {
public:
void reOrderArray(vector<int> &array)
{
vector<int>oddnum;
vector<int>evennum;
for(int i=0;i<array.size();i++)
{
if(array[i]%2==1)
oddnum.push_back(array[i]);
else
evennum.push_back(array[i]);
}
for(int i=0;i<oddnum.size();i++)
array[i]=oddnum[i];
for(int i=0;i<evennum.size();i++)
array[i+oddnum.size()]=evennum[i];
oddnum.clear();
evennum.clear();
}
};
也可以遍历所有的元素,先将所有的奇数放入一个容器中,再次遍历,将偶数放进去,最后将排序好的元素赋值给原序列
class Solution {
public:
void reOrderArray(vector<int> &array)
{
vector<int>result;
for(int i=0;i<array.size();i++)
{
if(array[i]%2==1)
result.push_back(array[i]);
}
for(int i=0;i<array.size();i++)
{
if(array[i]%2==0)
result.push_back(array[i]);
}
array=result;
}
};
方法二:
类似冒泡算法,前偶后奇数就交换
class Solution {
public:
void reOrderArray(vector<int> &array)
{
for(int i=0;i<array.size();i++)
{
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]);
}
}
}
};
方法三:
从头到尾遍历,遇见奇数,继续向前运动,遇见偶数,就将后面的所有数依次向前移动一位,并将该偶数插到末端,直到访问完所有的元素
class Solution {
public:
void reOrderArray(vector<int> &array)
{
int len=array.size();
if(len==0)
return;
int index=0,count=0;
while(count<len)
{
while(count<len && array[index]%2==1)//为奇数,向前运动
{
index++; //下标值
count++; //计数器,保证将所有的元素访问一遍
}
if(count>=len)
break;
while(count<len && array[index]%2==0)//为偶数,就将后面的数依次向前移动一位,此偶数插在最后
{
int tmp=array[index];
for(int i=index;i<len;i++)
array[i]=array[i+1];
array[len-1]=tmp;
count++;
}
}
}
};