题目如下: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 如输入数组1,4,2,7,8,9,输出结果为1,7,9,2,4,8。
#include <stdio.h>
#define N 10
int is_odd(int num)
{
if(num % 2 != 0)
return 1;
}
void init(int *array)
{
int i;
srand(time(NULL));
for(i = 0; i < N; i ++)
array[i] = rand() % 100;
}
void swap(int *i, int *j)
{
int tmp;
tmp = *i;
*i = *j;
*j = tmp;
}
void print(int *array)
{
int i;
for(i = 0; i < N; i ++)
printf("%d ", array[i]);
printf("\n");
}
void sort(int *array)
{
int i = 0, j = N - 1;
for(i = 0; i < j; i ++){
if(! is_odd(array[i]))
for(j = N - 1; j > i; j --)
if(is_odd(array[j])){
swap(array + i, array + j);
break;
}
}
}
int main(int argc, char ** argv)
{
int array[N];
init(array);
print(array);
sort(array);
print(array);
return 0;
}
最简单的方法是分配一个新的同样大的数组,扫描原数组,奇数从前往后放到新数组,偶数从后往前放新数组,然后拷贝回来,释放新数组。这个代码太简单了,我就不写了。
下面是个更快一点、只需要O(1)空间的算法,也许你会觉得很眼熟。