將數組中的所有奇數放到所有偶數前面--函數指針

題意:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位予數組的後半部分。

分析:

(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即可。注意函數指針的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章