面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
void ReorferOddEven(int *arr,int n)
{
if(arr==NULL || n<=0)
return;
int i = 0;
int j = n-1;
while(i <= j)
{
while(i<=j && (arr[i]&0x1)!=0) ++i;//奇数就直接往后走,直到它指向偶数
while(i<=j && (arr[j]&0x1)==0) --j;//偶数就直接往前走,直到它指向奇数
if(i <= j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
void show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
cout<<arr[i]<<ends;
}
cout<<endl;
}
int main()
{
int arr[] = {23,44,12,56,77,87,34,66,22,11,80};
cout<<"调整前:";
show(arr,sizeof(arr)/sizeof(arr[0]));
ReorferOddEven(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"调整后:";
show(arr,sizeof(arr)/sizeof(arr[0]));
}
给一个通用模式,能解决同一类问题
template <typename Type>
void Reorder(Type *arr,int len,bool (*fun)(Type) )
{
if(arr==NULL || len<=0)
return;
Type *pBegin = arr;
Type *pEnd = arr+len-1;
while(pBegin < pEnd)
{
while(pBegin<pEnd && !fun(*pBegin)) pBegin++;
while(pBegin<pEnd && fun(*pEnd)) pEnd--;
if(pBegin < pEnd)
{
Type tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
}
}
}
template <typename Type>
bool IsEven(int n)
{
return (n & 1) == 0;
}
template <typename Type>
void show(Type *arr,int len)
{
for(int i=0;i<len;i++)
{
cout<<arr[i]<<ends;
}
cout<<endl;
}
int main()
{
int arr[] = {23,44,12,56,77,87,34,66,22,11,80};
cout<<"调整前:";
show<int>(arr,sizeof(arr)/sizeof(arr[0]));
Reorder<int>(arr,sizeof(arr)/sizeof(arr[0]),&IsEven<int>);
cout<<"调整后:";
show<int>(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}