《劍指offer》 -- (8)調整數組順序使奇數位於偶數前面

題目描述:

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

思路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是一個具體的標準。

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