题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
分析: 最后数组元素分两段处于不同状态,很容易联想到快速排序的一趟分拣过程.
维护两个指针lt和rt,第一个指针lt初始化为数组的第一个数字,它只向后移动,直到指向一个偶数;第二个指针rt初始化为数组的最后一个数字,它只向前移动,直到指向一个奇数;如果lt<rt,则交换就交换他们指向的数组元素。
参考:http://caoruntao.iteye.com/blog/1157002
不多说,上代码:
#include<stdio.h>
#define isOdd(x) ((x%2)==0)
#define swap(x,y) {(x)=(x)+(y); (y)=(x)-(y); (x)=(x)-(y);}
int reorderOddEven(int* arr, int n)
{
int *lt = arr;
int *rt = arr+n-1;
if(NULL==arr || n<=1) return 0;
while(lt < rt)
{
while(!isOdd(*lt)) ++lt;
while(isOdd(*rt)) --rt;
if(lt < rt) swap(*lt,*rt);
}
}
int main(int argc, char** argv)
{
int i;
int a[] = {1,10,3,4,5,6,7,8,2,9};
int len = sizeof(a)/sizeof(a[0]);
reorderOddEven(a, len);
for(i = 0; i < len; ++i)
printf("%d ", a[i]);
printf("\n");
return 0;
}