题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
要求:空间复杂度O(1),时间复杂度为O(n)。
分析:分别从数组两端向中间推进。推出条件为左右相撞
当左端值为偶数,并且右端值为奇数时交换二值,用到一个临时空间。
当左端值为奇数,向右推进一个单位
当右端值为偶数,向左推进一个单位
Code如下:
/*
* Author: Administrator
* 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
* 要求:空间复杂度O(1),时间复杂度为O(n)。
*/
#include <stdio.h>
#define ODD(s) (s%2)?1:0 //奇数
#define EVEN(s) (s%2)?0:1 //偶数
void sortEvenOdd(int array[], int length)
{
int i = 0;
int j = length -1;
int tmp = 0;
while( i < j)
{
if(EVEN(array[i])&& ODD(array[j]))
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
if(ODD(array[i]))
{
i++;
}
if(EVEN(array[j]))
{
j--;
}
}
}
int main(void){
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int length = sizeof(arr)/sizeof(arr[0]);
sortEvenOdd(arr, length);
int m = 0;
for(m = 0; m < length ;m++)
{
printf("%d\t",arr[m]);
}
return 0;
}