想法:
我们首先定义一个头i,和尾j,要保证i<j,接下还是来我们我们先从头找,若是奇数那就i++,如为偶数则退出次循环,接下来在从尾找,若为偶数则j++,若为奇数则次循环退出,这时我们就找到了一对不符合条件的数字,对这对数字进行交换,然后i++,j--,接着找。
这里说明一下:判断奇偶,除了可以用a[i]%2之外,我们可以通过位运算来判断,因为一个数是奇数还是偶数是由他的最低比特位决定的,因为一个二进制的数转为十进制,除了最低比特位前面都可以提出一个共有的2,因此若最低比特位为1则为奇数,为0则为偶数
下面我们来看看程序吧
void switchData (int a[], int size)
{
assert(a);
assert(size > 0);
int i = 0;
int j = size - 1;
while (i < j){
while (i < j && (a[i]&1)){ //一个数是奇数还是偶数是由他的最低比特位决定的,因为前面的数都可以提出一个2,所以要想他是奇数,那么&1为真
i++;
}
while (i < j &&(!(a[j]&1))){ //检测偶数,若是偶数 &1则为假,所以取反
j--;
}
if (i < j)
{
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
i++,j--;
}
}
}
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int size = sizeof(a) / sizeof(a[0]);
switchData (a, size);
int i = 0;
for (i = 0; i < size; i++){
printf("%d ",a[i]);
}
system("pause");
return 0;
}
程序结果图: