題目描述:
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使的所有奇數位於數組的前半部分,所有的偶數位於數組的後半部分。
思路1:將數組中的數字分爲兩部分,那我們可以在遍歷數組的時候多定義一個變量,讓該變量來存儲奇數,在遍歷的過程中如果遇到奇數,則交換。
很快可以寫下如下代碼:
void Move1(int *arr,int len,bool pfunc(int))//pfunc爲函數指針
{
if(NULL==arr || len<=0)
return ;
int k=-1;
int i=0;
while(i<len)
{
if(!pfunc(arr[i]))//如果arr[i]爲奇數,則增大k的範圍
{
k++;
SWAP(arr[i],arr[k]);
}
i++;
}
}
bool fun(int n)
{
return (n&1)==0;
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,12};
int len=sizeof(arr)/sizeof(arr[0]);
Move1(arr,len,fun);
for(int i=0;i<len;i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
2、當然也可以用兩個前後指針來遍歷數組:
void Move2(int *arr,int len,bool (*func)(int))//第一種:用兩個指針
{
if(NULL==arr || len<=0)
return ;
int *begin=arr;//首指針
int *end=arr+len-1;//尾指針
while(begin<end)
{
while(begin<end && !func(*begin))//while(begin<end && (*begin & 0x1)!=0)
begin++;
while(begin<end && func(*end))//while(begin<end && (*begin & 0x1)==0)
end--;
if(begin<end)
SWAP(*begin,*end);
}
}
void Move3(int *arr,int len,bool (*func)(int))//第二種:用兩個下標來代替指針
{
if(NULL==arr || len<=0)
return ;
int i=0;
int j=len;//j用來記錄偶數的下標
while(i<j)
{
while(i<j && !func(arr[i]))
i++;
while(i<j && func(arr[j]))
j--;
if(i<j)
{
SWAP(arr[i],arr[j]);
i++;
j--;
}
}
}
bool fun(int n)
{
return (n&1)==0;
}
int main()
{
int brr[]={1,2,3,4,5,6,7,8,9,12};
Move2(brr,len,fun);
for(int i=0;i<len;i++)
{
cout<<brr[i]<<" ";
}
cout<<endl;
int crr[]={1,2,3,4,5,6,7,8,9,12};
Move3(crr,len,fun);
for(int i=0;i<len;i++)
{
cout<<crr[i]<<" ";
}
cout<<endl;
return 0;
}
說明:爲什麼要用函數指針呢?因爲這樣不僅可以解決一類題,而且在面臨具體的問題時,我們只需要修改具體的fun函數就可以了,提高了代碼的重用度。
在函數Move中,根據pfunc的標準把數組分爲了兩個部分,函數fun是一個具體的標準。