题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解法
解法一
1、先统计奇数的个数,假设为n个,再创建一个同样大小的数组arry。
2、用两个指针low,high指向新开的数组。分别是low=0和high=n
3、遍历原数组,若当前元素为奇数则arr[low++]=array[i];否则,arr[high++]=array[i]。
4、最后把新数组的值依次赋值给原数组
时间复杂度:O(N)。
空间复杂度:O(N)。
代码:
class Solution {
public:
void reOrderArray(vector<int> &array)
{
int size=array.size();
int arr[size];
int oddnum=0;
for(int i=0;i<array.size();i++)
if(array[i]%2==1)
oddnum++;
int low=0;
int high=oddnum;
for(int i=0;i<array.size();i++)
{
if(array[i]%2==1)
arr[low++]=array[i];
else
arr[high++]=array[i];
}
for(int i=0;i<size;i++)
array[i]=arr[i];
}
};
解法二
参考快速排序
i++往前走碰到偶数停下来,j = i+1
若 a[j]为偶数,j++前进,直到碰到奇数
a[j]对应的奇数插到a[i]位置,j经过的j-i个偶数依次后移
如果j==len-1时还没碰到奇数,证明i和j之间都为偶数了,完成整个移动
代码:
class Solution {
public:
void reOrderArray(vector<int> &array)
{
int len = array.size();
if(len <= 1)
return;
int i = 0;
while(i < len)
{
int j = i + 1;
if(array[i]%2 == 0)
{ // a[i]为偶数,j前进,直到替换
while(array[j]%2 == 0)
{ // j为偶数,前进
if(j==len-1)// i为偶数,j也为偶数,一直后移到了末尾,证明后面都是偶数
return;
j++;
}
// 此时j为奇数
int count = j-i;
int temp = array[i];
array[i] = array[j];
while(count>1)
{
array[i+count] = array[i+count-1];//数组后移
count--;
}
array[i+1] = temp;
}
i++;
}
}
};