调整数组使奇数位于偶数之前
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路
冒泡排序
不断将在奇数前的偶数交换位置。
一轮过后,最后一个肯定是偶数。
降低for循环判断的长度,直到0
class Solution {
public:
void reOrderArray(vector<int> &array) {
//冒泡排序的思想,将偶数冒泡至右侧
int len = array.size();
while(len--)
{
bool changeFlag = false;
for(int i=0; i<len; i++)
{
if(array[i]%2==0 && array[i+1]%2!=0)
{
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
changeFlag = true;
}
}
if(!changeFlag)
return;
}
}
};
维持两个指针
1 2 4 6 3 7
^ p1 ^p2
- 得到第一个偶数
- 得到偶数后的第一个奇数
- 将偶数和奇数前的数字都整体往后移1
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
int p1 = 0; //指向偶数
int p2; //奇数
while(p1<len)
{
while(p1<len && (array[p1]&0x1) )
++p1;//是奇数就++,得到第一个偶数
p2 = p1+1;
while(p2<len && !(array[p2]&0x1))
++p2;//是偶数就++,得到第一个偶数后的第一个奇数
if((array[p2]&0x1))
{
int tmp = array[p2];
for(int i=p2; i>p1; --i) //[p1, p2-1]整体后移一位
{
array[i] = array[i-1];
}
array[p1] = tmp;
++p1;
}
else
break;
}
}
};
前后两个指针,不保证奇数和奇数,偶数和偶数之间的相对位置不变
- 前面的指针p1指向偶数
- 后面的指针p2指向奇数
- 当p1<p1时,交换位于前面的偶数,和位于后面的奇数,使奇数在偶数前
//不能保证奇数和偶数的顺序
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
int p1 = 0; //指向偶数
int p2 = array.size() - 1; //指向奇数
while(p1<p2)
{
while(p1<len && (array[p1]&0x1) )
++p1;//是奇数就++
while(p2>=0 && !(array[p2]&0x1))
--p2;//是偶数就--
if(p1<p2)
{
int tmp = array[p1];
array[p1] = array[p2];
array[p2] = tmp;
}
}
}
};