算法思想很简单:
我们定义两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动。第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,第二个指针指向的数字是奇数,则交换这两个数字
#include<iostream>
using namespace std;
void ReorderOddEven(int *pData,unsigned int length)
{
if(pData==NULL ||length==0)
{
return;
}
int *pBegin=pData;
int *pEnd=pData+length-1;
while(pBegin<pEnd)
{
while(pBegin<pEnd && (*pBegin & 0x1)!=0)
{
pBegin++;
}
while(pBegin<pEnd && (*pEnd & 0x1)==0)
{
pEnd--;
}
if(pBegin<pEnd)
{
int temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
}
}
}
int main()
{
int a[]={2,6,8,3,5,0,2,5,7,3,8,6,4,9,7,4,6,9};
unsigned int length=sizeof(a)/sizeof(int);
ReorderOddEven(a,length);
for(int i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
system("pause");
return 0;
}
该程序有一种可以扩展性的解法:
即把该问题的判断标准单独拿出来实现
void Reorder(int *pData,unsigned int length)
{
if(pData==NULL || 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 n)
{
return (n & 1)==0;
}
此时该函数就是根据func的标准把数组pData分成了两部分,而函数isEven则是一个具体标准。