/* ============================================================================ Name : ReorderOddEven.c Author : 齐保元 Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include <assert.h> /** * 判断一个数手否是2的整数次幂 * */ int isPow(int num) { return num & (num - 1); } /** * 一个数二进制中1的个数 */ int numberOfOne(int num) { int count = 0; while (num) { ++count; num = (num - 1) & num; } return count; } /** * 判断一个数是否是偶数 */ int isEven(int num) { return num & 1; } void reorder(int* pdata, unsigned int len, int(*isEven)(int)) { assert(pdata != NULL); assert(len != 0); int* pBegin = pdata; int* pEnd = pdata + len - 1; //使得奇数位于偶数前面 while (pBegin < pEnd) { if (!isEven(*pBegin)) { pBegin++; continue; } if (isEven(*pEnd)) { pEnd--; continue; } //否则,即偶数位于奇数前面,则交换 int tmp = *pEnd; *pEnd = *pBegin; *pBegin = tmp; } } void reorderOddEven(int* pData, int len) { assert(pData != NULL); assert(len != 0); reorder(pData, len, isEven); } int main(void) { int data[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int i = 0; reorderOddEven(data, sizeof(data) / sizeof(data[0])); for (i = 0; i < sizeof(data) / sizeof(data[0]); i++) { printf("%d/t", data[i]); } return EXIT_SUCCESS; }