劍指offer:調整陣列順序
阿新 • • 發佈:2018-12-31
題目:調整陣列順序,使奇數位於偶數前面。
輸入一個整形陣列,實現一個函式調整陣列中數字順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。
整體思路:
思路1:
掃描陣列,前指標指向第一個數字,向後走;後指標指向最後一個數字,向前走,若偶數在奇數前面,交換這兩數字。
程式碼:
#include<stdio.h> void ReoederOddEven(int *pData, unsigned int length) { if (pData == NULL || length == 0) { return; } int *pBegin = pData; int *pEnd = pData + length - 1; while (pBegin < pEnd) // *pBegin *pEnd 代表裡面的數字 { while (pBegin < pEnd && (*pBegin & 0x1)!=0) //向後移動begin,直到它指向偶數 { pBegin++; } while (pBegin < pEnd && (*pEnd & 0x1)==0)//向前移動pEnd,直到它指向奇數 { pEnd--; } if (pBegin < pEnd) // 交換偶數和奇數 { int t = *pBegin; *pBegin = *pEnd; *pEnd = t; } } } int main() { int arr[] = { 1,2,3,4,5 }; ReoederOddEven(arr, sizeof(arr) / sizeof(arr[0])); for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
執行結果:
1 5 3 4 2
思路2:
函式指標寫法,可提高擴充套件性
為了讓程式碼的擴充套件性更強,可以將這些判斷標準單獨寫成一個函式介面,而主程式碼框架保持不變。
將邏輯框架抽象出來,把判斷標準變成一個函式指標,也就是用一個函式來判斷數字是不是符合標準。
程式碼:
#include<stdio.h> bool isEven(int n); void ReoederOddEven(int *pData, unsigned int length); void Reorder(int *pData, unsigned int length, bool(*func)(int)); bool isEven(int n)// 1&1 奇數 1==0 ? 1≠0 返回 0 說明是奇數 { return(n & 1) == 0; } //把函式指標當成一個引數,聲明瞭一個指標func,指向了函式 呼叫 func(3,4)或(*func)(3,4) 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 *pEnd 代表裡面的數字 { // !func(*pBegin)表示 *pBegin %2 != 0 while (pBegin < pEnd && !func(*pBegin)) //向後移動begin,直到它指向偶數 { pBegin++; } // func(*pEnd) 表示 *pEnd % 2 == 0 while (pBegin < pEnd && func(*pEnd))// 向前移動pEnd,直到它指向奇數 { pEnd--; } if (pBegin < pEnd) // 交換偶數和奇數 { int t = *pBegin; *pBegin = *pEnd; *pEnd = t; } } } void ReoederOddEven(int *pData, unsigned int length) { Reorder(pData, length, isEven); } int main() { int arr1[] = { 1,2,3,4,5 }; ReoederOddEven(arr1, sizeof(arr1)/sizeof(arr1[0])); for (int i = 0; i < 5; i++) { printf("%d ", arr1[i]); } printf("\n"); return 0; }
執行結果:
1 5 3 4 2