请按照如下要求设计一个算法:将整型一维数组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
- using namespace std;
-
- int a[5]={1,2,4,5,6};
- void get(int a[])
- {
- int first=0;
- int last=4;
- while(first
- {
- 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;
- }