一、针对奇数偶数这一种情况的解决方案
#include<iostream>
void ReorderOddEven(int* pData, int length)
{
if (pData==nullptr||length <= 0)return;
int* pBegin = pData;
int* pEnd = pData + length - 1;
while (pBegin < pEnd)
{
//前指针找到偶数
while (pBegin < pEnd && (*pBegin & 0x1) == 1)
pBegin++;
//后指针找到奇数
while (pBegin < pEnd && (*pEnd & 0x1) == 0)
pEnd--;
if (pBegin < pEnd)
{
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
}
int main(int argc, char* argv[])
{
const int length = 5;
int pData[length] = { 1,2,3,4,5 };
ReorderOddEven(pData, length);
for (int i = 0;i < length;++i)
std::cout << pData[i] << " ";
std::cin.get();
return 0;
}
二、通用解决方案(运用函数指针,将判断条件修改一下即可,用的时候提供相应的判断函数即可)
#include<iostream>
//bool (*func)(int)函数指针
void Reorder(int* pData, int length, bool (*func)(int))
{
if (pData==nullptr||length <= 0)return;
int* pBegin = pData;
int* pEnd = pData + length - 1;
while (pBegin < pEnd)
{
//前指针找到偶数
while (pBegin < pEnd && !func(*pBegin))
pBegin++;
//后指针找到奇数
while (pBegin < pEnd && func(*pEnd))
pEnd--;
if (pBegin < pEnd)
{
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
}
bool isEven(int pDate)
{//判断函数
return (pDate & 0x1) == 0;
}
void ReorderOddEven(int* pData, int length)
{
Reorder(pData, length, isEven);
}
int main(int argc, char* argv[])
{
const int length = 5;
int pData[length] = { 1,2,3,4,5 };
ReorderOddEven(pData, length);
for (int i = 0;i < length;++i)
std::cout << pData[i] << " ";
std::cin.get();
return 0;
}