1)
从头扫描数组,碰到偶数拿出,后面数字前挪,这个偶数放在最后每碰到偶数移动O(n),时间复杂度为O(n^2)
2)
两个指针,第一个指向数组的第一个数字,向后移动,第二个指针指向数组的最后一个数字,
它指向数组最后的数字,相遇前,如果第一个指针指向的数字是偶数,第二个指针指向数字是奇数,交换这两个数字
void ReorderOddEven(int *pData,unsigned int length)
{
if(pData==NULL||length==0)
return;
int *pBegin=data;
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;
}
}
}
3)解决一类问题,如移动负数到非负数前面等
void Reorder(int *pData,unsigned int length,bool (*func)(int))
{
if(pData==NULL||length==0)
return;
int *pBegin=data;
int *pEnd=pData+length-1;
while(pBegin<pEnd)
{
while(pBegin<pEnd&&!func(*pBedin))
pBegin++;
while(pBegin<pEnd&&func(*pEnd))
pEnd--;
if(pBegin<pEnd)
{
int temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
}
}
}
bool isEvent(int n)
{
return (n&1)==0;
}
void ReorderOddEven(int *pData,unsigned int length)
{
Reorder(pData,length,isEvent);
}