題意:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位予數組的後半部分。
分析:
(1)一般的做法:我們可以維護兩個指針,第一個指針初始化時指向數組的第一個數字,它只向後移動;第二個指針初始化時指向數組的最後一個數字, 它只向前移動。在兩個指針相遇之前,第一個指針總是位於第二個指針的前面。如果第一個指針指向的數字是偶數,並且第二個指針指向的數字是奇數, 我們就交換這兩個數字。
代碼:
void reorderOddEven(int* pData,unsigned int length){
if(pData==NULL||length==0)
return;
int* pBegin=pData;
int* pEnd=pData+length-1;
while(pBegin<pEnd){
while(pBegin<pEnd&&(*pBegin&0x1)!=0)
pBegin++;
while(pBegin<pEnd&&(*pEnd&0x1)==0)
pEnd--;
if(pBegin<pEnd){
int temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int data[8]={3,6,4,5,97,24,3,1};
reorderOddEven(data,8);
for(int i=0;i<8;i++)
cout<<data[i]<<endl;
system("pause");
return 0;
}
注意:調用的時候只能用數組的方式,不能用指針的方式。這點在處理c風格的字符串時一定要注意~
(2)可擴展的解法(推薦):用函數指針。將判斷的標準,即什麼樣的數在數組前面,什麼樣的數在數組後面的這個判斷標準用一個函數指針來實現,這樣,對於任何這類型的題都只需要修改這個判斷函數就行。
代碼:
void reorderOddEven(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){
while(pBegin<pEnd&&!func(*pBegin))//注意這裏
pBegin++;
while(pBegin<pEnd&&func(*pEnd))//注意這裏
pEnd--;
if(pBegin<pEnd){
int temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
}
}
}
bool IsEven(int n){
return (n&0x1)==0;
}
調用:reorderOddEven(data,8,IsEven);
這樣,對於任何新的劃分標準,只需要修改標準判斷函數IsEven即可。注意函數指針的使用