问题:输入一个数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
解题思路:最简单的思路是直接从头到尾扫描这个数组,没碰到一个偶数,取出这个偶数并把位于其后的所有数字往前挪动一位,挪完之后,将取出的偶数放到末尾的空位上,这种方法没碰到一个偶数就需要移动O(n)个数字,因此该方法的总的时间复杂度是O(n的平方)。换一种思路,维护两个指针,第一个指针初始化时指向数组的第一个数字,它只往后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面,如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,则交换这两个数字。
void OddEvenOrder(int *pData, int len)
{
if(pData == nullptr || len == 0)
return ;
int *pBegin = pData;
int *pEnd = pData + len - 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;
}
}
}