题目:输入一个整数数组,实现一个函数来解决该数组中数字的位置,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
本题思路较为简单,我们只需维护两个指针:第一个指针pHead 初始化为数组的第一个元素,第二个指针pTail 初始化为数组的最后一个元素。根据题目要求:所有奇数位于数组的前半部分,偶数位于数组的后半部分;我们只需:
1、使指针pHead 向后遍历,直到指向的整数为偶数;
2、使指针pTail 向前遍历,直到指向的整数为奇数;
3、交换指针pHead 和指针pTail 所指向的元素。
4、在 pHead 和 pTail 相遇之前,pHead继续向后遍历,pTail继续向前遍历。
实现代码为:
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 #define N 10 5 6 void swap(int *left, int *right); 7 void printArr(int *arr, int len); 8 void initArr(int *arr, int len); 9 void reorderOddEven(int *arr, int len); 10 11 void swap(int *left, int *right) 12 { 13 int tmp = *left; 14 *left = *right; 15 *right = tmp; 16 } 17 18 void printArr(int *arr, int len) 19 { 20 int i; 21 for(i = 0; i < len; ++i) 22 { 23 printf("%3d", arr[i]); 24 } 25 printf("\n"); 26 } 27 28 void initArr(int *arr, int len) 29 { 30 int i; 31 for(i = 0; i < len; ++i) 32 { 33 arr[i] = rand() %100; 34 } 35 } 36 37 void reorderOddEven(int *arr, int len) 38 { 39 int *pHead = arr; 40 int *pTail = arr + len -1; 41 42 while(pHead < pTail) 43 { 44 while(pHead < pTail && (*pHead & 0x1) != 0) 45 pHead++; 46 47 while(pHead < pTail && (*pTail & 0x1) == 0) 48 pTail--; 49 50 if(pHead < pTail) 51 swap(pHead, pTail); 52 } 53 } 54 55 int main(int argc, char const *argv[]) 56 { 57 int arr[N] = {0}; 58 initArr(arr, N); 59 printf("Before: "); 60 printArr(arr, N); 61 62 reorderOddEven(arr, N); 63 printf("After: "); 64 printArr(arr, N); 65 66 return 0; 67 }