请按照如下要求设计一个算法:将整型一维数组A[n]调整为左右两个部分,使得左边所有元素均为奇数。右边所有元素均为偶数,要求算法时间复杂度为O(n),空间复杂度为O(1)。
解题思路:
1.设立标记first和last分别指向数组中第一个元素和最后一个元素
2.若 a[first] 为奇数且 a[last] 为偶数,则 first 向后移一位,last 向前移一位
3.若 a[first] 为偶数且 a[last] 为奇数,则二者交换位置,然后 first 向后移一位,last 向前移一位
4.若均为偶数,则 first 不动,last 向前移一位
5.若均为奇数,则 last 不动,first 向后一位
6.注意循环条件是 first < last
#include<stdio.h>
using namespace std;
int a[5]={1,2,4,5,6};
void get(int a[])
{
int first=0;
int last=4;
while(first<last)
{
if(a[first]%2==1&&a[last]%2==0)//若f为奇,l为偶
{
first=first+1;
last=last-1;
}
else if(a[first%2==0&&a[last]%2==1])//若f为偶,l为奇
{
int t=a[first];
a[first]=a[last];
a[last]=t;
first+=1;
last-=1;
}
else if(a[first]==0&&a[last]%2==0)//均为偶
{
last-=1;
}
else//均为奇
{
first+=1;
}
}
}
int main()
{
get(a);
for(int i=0;i<5;i++)
{
printf("%d ",a[i]);
}
return 0;
}