14. 調整數組順序使奇數位於偶數前面

題目描述

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

解析

注意代碼的重用性構建。

實現

void ReorderOddEven_1(int *pData, unsigned int length){
    //傳參有效性判斷
    if (pData == NULL || length <= 0)
        return;
    int* pBegin = pData;
    int* pEnd = pData + length - 1;
    while (pBegin < pEnd){
        //pBegin向後移動,直到指向偶數
        while (pBegin < pEnd  && (*pBegin & 0x1) != 0){
            pBegin++;
        }
        //pEnd向前移動,直到指向奇數
        while (pBegin < pEnd && (*pEnd & 0x1) == 0){
            pEnd--;
        }
        //pBegin<pEnd,交換奇數和偶數
        if (pBegin < pEnd){
            int tmp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = tmp;
        }
    }
}

代碼重用性

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

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) 
    {
        // 向後移動pBegin
        while(pBegin < pEnd && !func(*pBegin))
            pBegin ++;

        // 向前移動pEnd
        while(pBegin < pEnd && func(*pEnd))
            pEnd --;

        if(pBegin < pEnd)
        {
            int temp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = temp;
        }
    }
}

bool isEven(int n)
{
    return (n & 1) == 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章