设置两个指针,分别指向数组的头和尾,交换奇偶
注意几点:
while循环中一定要加上start < end,不然有出边界的可能
判断奇偶可以用位运算效率更高 & 0x1
我的代码:
1 void ReorderOddEven_1(int *pData, unsigned int length) 2 { 3 if (pData == NULL || length <= 0) 4 return; 5 int start = 0; 6 int end = length - 1; 7 while (start < end) 8 { 9 while (start < end && pData[start] % 2 != 0) 10 start++; 11 while (start < end && pData[end] % 2 == 0) 12 end--; 13 if (start < end) 14 { 15 int temp = pData[start]; 16 pData[start] = pData[end]; 17 pData[end] = temp; 18 } 19 } 20 }
示例代码:
1 void ReorderOddEven_1(int *pData, unsigned int length) 2 { 3 if(pData == NULL || length == 0) 4 return; 5 6 int *pBegin = pData; 7 int *pEnd = pData + length - 1; 8 9 while(pBegin < pEnd) 10 { 11 // 向后移动pBegin,直到它指向偶数 12 while(pBegin < pEnd && (*pBegin & 0x1) != 0) 13 pBegin ++; 14 15 // 向前移动pEnd,直到它指向奇数 16 while(pBegin < pEnd && (*pEnd & 0x1) == 0) 17 pEnd --; 18 19 if(pBegin < pEnd) 20 { 21 int temp = *pBegin; 22 *pBegin = *pEnd; 23 *pEnd = temp; 24 } 25 } 26 }