您好,登錄后才能下訂單哦!
題目:
調整數組順序使奇數位于偶數前面
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位于數組的前半部分,所有偶數位于數組的后半部分
程序1.0:
使用兩個指針一個指向頭一個指向尾,如果頭指針遇到奇數就后移,遇到偶數就和尾指針指向的元素交換,頭指針交換完成后后移,尾指針交換完成后前移,當兩指針指向同一地址交換結束
void ReorderOddEven(int *pData, size_t length) { assert(pData); assert(length); int*pHead = pData; int*pTail = pData + length - 1; while (pHead != pTail) { if ((*pHead & 0x1) == 0)//為偶數 { swap(*pHead, *pTail); pTail--; } pHead++; } }
程序1.1
void ReorderOddEven(int *pData, size_t length) { assert(pData); assert(length); int *pHead = pData; int*pTail = pData + length - 1; while (pHead < pTail); { while (((*pHead & 0x1) != 0) && (pHead < pTail))//前面數若為奇數 { pHead++; } while (((*pHead & 0x1) == 0) && (pHead < pTail))//若后面的數為偶數 { pTail--; } if (pHead < pTail) { swap(*pHead, *pTail); } } }
程序2.0
若要把題目改為:將正數放到負數前面或者改為將能被三整除的數放到不能被三整數的數的前面只需要將while里的循環條件改一下就可以
但是,若想要一個通用的模板呢?(即不要改變函數,只改變判斷條件)
void ReorderOddEven(int *pData, size_t length, bool(*func)(int)) { assert(pData); assert(length); Reorder(pData, length, isEven); } void Reorder(int *pData, size_t length, bool(*func)(int)) { int *pHead = pData; int*pTail = pData + length - 1; while (pHead < pTail); { while (((*pHead & 0x1) != 0) && !func(*pHead))//前面數若為奇數 { pHead++; } while (((*pHead & 0x1) == 0) && func(*pTail))//若后面的數為偶數 { pTail--; } if (pHead < pTail) { swap(*pHead, *pTail); } } } bool isEven(int n) { return (n & 0x1) == 0; }
這樣,就可以通過改變函數isEven的內容來改變整體函數的條件,增加了函數的可移植性和健壯性
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。