您的位置:首页 > 其它

调整数组顺序使奇数位于偶数前面

2018-01-18 11:15 211 查看

1、题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

2、代码

(1)自己代码1

// 自己实现1
void reOrderArray1(vector<int> &array)
{
vector<int> vecj, vecO;
for(auto iter=array.begin();iter!=array.end();iter++)
{
if((*iter)&0x01)   //奇数
vecj.push_back(*iter);
else       //偶数
vecO.push_back(*iter);
}
copy(vecj.begin(), vecj.end(),array.begin());
copy(vecO.begin(), vecO.end(), array.begin()+vecj.size());
}


注意:这里主要用到了copy()函数。

(2)其他代码

//自己实现2
void reOrderArray2(vector<int> &array)
{
for(int i=0;i<array.size();i++)
{
if(!(array[i]&0x01))        //偶数
{
//bool bTemp = false;
for(int j=i+1;j<array.size();j++)
{
if(array[j]&0x01)       //奇数
{
int temp = array[j];
for(int m=j;m>i;m--)
array[m]=array[m-1];
array[i] = temp;
break;
}
}
}
}
}


这里的代码虽然复杂度较高,但是代表了一种思路,可能用在这里不是很好,但是这种思路不错。要想保证原有次序,则只能顺次移动或相邻交换,是不能直接距离不是0的两个位置的数据直接交换的,这样后面顺序都会出错。

(3)犯错点:

下面记录一个自己在写代码的时候犯的一个错误:

if(!array[i]&0x01){...}
// 这里这样判断奇偶数是错误的,因为“!”的优先级较高,比“&”的优先级高,正确写法如下:
if(!(array[i]&0x01)){...}


以后写代码记得用位运算代替“%”来判别数的奇偶

3、扩展

(1)题目:如果只是替换,奇数和偶数各个之间的相对顺序可以变化。

(2)代码:

// 代码:如若不考虑相对顺序
void reOrderArray3(vector<int> &array)
{
int start=0, end=array.size()-1;
while(start<end)
{
while((start<end)&&((array[start]&0x01)))
start++;
while((start<end)&&(!(array[start]&0x01)))
end++;
if(start<end)
{
int temp = array[start];
array[start] = array[end];
array[end] = temp;
}
}
}


(3)这里需要强调的是这种编程的思路,特别重要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: