【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】

weixin_33850890發表於2018-01-30

題目:

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位予陣列的後半部分。

思路:

把奇數放在陣列的前半部分, 偶數放在陣列的後半部分,因此所有的奇數應該位於偶數的前面。也就是說我們在掃描這個陣列的時候, 如果發現有偶數出現在奇數的前面,我們可以交換它們的順序,交換之後就符合要求了。

因此我們可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,它只向後移動:第二個指標初始化時指向陣列的最後一個數字, 它只向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標指向的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換這兩個數字。

程式碼:

void oddEvenSort (int *numArray, int numLength) {
    if (numArray == NULL || numLength == 0) {
        return;
    }
    
    int startIndex = 0;
    int endIndex = numLength - 1;
    
    while (startIndex < endIndex) {
        // 從前往後找 找到 偶數
        while (startIndex < endIndex && numArray[startIndex] % 2 != 0) {
            startIndex++;
        }
        // 從後往前找 找到 奇數
        while (startIndex < endIndex && numArray[endIndex] %2 == 0) {
            endIndex--;
        }
        
        int temp = numArray[startIndex];
        numArray[startIndex] = numArray[endIndex];
        numArray[endIndex] = temp;
    }
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        int array[] = {1, 4, 5, 10, 8, 7};
        oddEvenSort(array, 0, 5);
        for (int tmpIndex = 0; tmpIndex < 6; tmpIndex++) {
            NSLog(@"%d", array[tmpIndex]);
        }
    
    }
    return 0;
}

相關文章