思路有点像快排,两个指针,分别从前和后往中间走,前面的指针遇到第一个偶数与后面遇到的第一个奇数交换。
O(n)
注意:判断奇偶的时候 加括号!!
#include <stdio.h>
void toOddEven(int arr[], int n);
void printfArray(int a[], int n);
int main(int argc, char *argv[])
{//测试用例:奇偶都有,只有奇数或只有偶数,只有一个数, 所有奇数都在前面,所有偶数都在前面
int a[] = {0,1,3,4,2,6,8,9,7,5} ;
printfArray(a, sizeof(a)/sizeof(int));
toOddEven(a, sizeof(a)/sizeof(int));
printfArray(a, sizeof(a)/sizeof(int));
int a2[] = {1,3,5,6,8} ;
printfArray(a2, sizeof(a2)/sizeof(int));
toOddEven(a2, sizeof(a2)/sizeof(int));
printfArray(a2, sizeof(a2)/sizeof(int));
return 0;
}
void toOddEven(int arr[], int n){
int i , j;
i = 0;
j = n-1;
int t ;
while(i<j){
while(((arr[i]&0x0001) == 0x0001)&&(i<j))//(arr[i]&0x0001)括号一定要加!! ==优先级比&高 ==!
i++;
while( ((arr[j]&0x1) == 0) && (i<j) ){//(arr[i]&0x0001)括号一定要加!!
j--;
}
if(i>=j)
break;
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
void printfArray(int a[], int n){
int i;
for(i=0 ; i<n ; i++){
printf("%d\t", a[i]);
}
printf("\n");
}