标签:
如果考虑暴力解决的话,就每次从前往后扫面,遇到偶数就放在最后,这样时间复杂度就是O(n*n),对于这种问题明显过高了,我们考虑扫描一遍,用两个指针,一个从前往后,另一个从后往前,碰到前偶后奇的时候就交换,这样算法复杂度只有O(n)。#include<stdio.h> #include<stdlib.h> void reset(int a[],int n) { int i=0,j=n-1,tmp=0; while(i<j) { if((a[i]%2==1)&&(a[j]%2==0)) { i++; j--; } else if((a[i]%2==1)&&(a[j]%2==1)) i++; else if((a[i]%2==0)&&(a[j]%2==1)) { tmp=a[i]; a[i]=a[j]; a[j]=tmp; } else j--; } } int main() { int n; while(scanf("%d",&n)!=EOF) { int *a=(int *)malloc(sizeof(int)*n); int i; for(i=0;i<n;i++) scanf("%d",&a[i]); reset(a,n); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/zyh920521/article/details/45507147