调整数组顺序使奇数位于偶数前面

这题可以维护2个指针,第一个指针初始化为数组的第一个数字,它向后移动。第二个指针初始化为数组最后一个数,它向前移动。

如果第一个指针指向的是偶数,而第二个指针又指向的是奇数,两者交换,直到2个指针相遇。

bool isEven(int n) //奇数返回false,偶数返回true
{
    return (n&1) == 0;
}

void Reorder(int *pData,unsigned int length, bool (*func)(int) )
{
    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;
        }
    }
}

void ReorderOddEven(int *pData, unsigned int length)
{
    Reorder(pData,length,isEven);
}

这里考虑到可扩展性的话将会得到很高分。我们只需别写其他判断函数即可实现不同功能,如把正数和负数分开,把能被3整出的数和不能被3整出的数分开。

posted @ 2013-03-03 14:57  没离开过  阅读(113)  评论(0)    收藏  举报