劍指offer 調整陣列順序使奇數字於偶數前面

2021-07-26 11:39:32 字數 1257 閱讀 9302

記錄來自《劍指offer》的演算法題。

題目如下:

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

最簡單的思路就是從頭開始掃瞄整個陣列,當碰到偶數的時候,拿出這個數字,將其後面的數字都往前移動一位,然後將這個偶數放到最後空出的位置上。這個方法的時間複雜度是o(n^2),效率不算高。

更好的方法可以參考二分查詢的思路,採用兩個指標,分別指向陣列的第乙個位置和最後乙個位置,第乙個指標向後移動,當遇到偶數的時候,而第二個指標向前移動,遇到奇數的時候,兩個指標就交換指向的數值。其實現**如下:

void reorderoddeven(int

*pdata, unsigned int

length)

int*pbegin = pdata;

int*pend = pdata + length - 1;

while (pbegin < pend)

}}// 輸出數值

void printarray(int

*a,int

length)

for (int i = 0; i < length; i++)

cout << a[i]<<" ";

cout << endl;

}

這個解法還可以進行拓展,用於解決不只是奇數偶數的問題,比如要將陣列按照大小分為兩部分,所有負數都在非負數的前面,或者是能被3整除的數排在不能被3整除的數的前面等。於是可以將判斷的標準變成乙個函式指標,用乙個單獨的函式來判斷數字是否符合標準。

下面是拓展後的函式**:

// 判斷是否是偶數

bool iseven(int n)

// 重新排序

void reorder(int

*pdata, unsigned int

length, bool (*func)(int))

int*pbegin = pdata;

int*pend = pdata + length - 1;

while (pbegin < pend)}}

void reorderoddeven(int

*pdata, unsigned int

length)

這裡用函式iseven()來判斷數字是否是偶數,然後在reorder函式中增加乙個函式指標。

更完整的例子可以檢視我的github。

劍指offer 調整陣列順序

時間限制 1秒 空間限制 32768k 本題知識點 陣列 題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。首先想到的是利用兩個輔助陣列,乙個儲存奇數,乙個儲存偶數,這樣的...

劍指offer(調整陣列順序)

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。1 暴力解法 從前到位掃瞄陣列,如果出現前面是偶數後面是奇數的情況,則交換。其中使用氣泡排序的思想。從後面朝前比較,使用外迴圈控制趟...

劍指offer(十三) 調整陣列順序

題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。題解 思路簡單的解法就是,建兩個臨時陣列,乙個奇數陣列,乙個偶數陣列,最後再組合起來即可,時間複雜度為o n 一解 pub...