这个自己相想了一个快排思想的 测试了 应该是没有问题。:-)
双指针用过很多次了。。这里最主要的一个问题是我第一次用函数指针 主要针对可扩展性的
/*
这题也是自己一下子就想到了 一个是双指针 一个是快排的思想。。
标准解法是双指针,但是这里提到了一个非常重要的问题
就是扩展性 如果面试官问 不按奇数偶数排序 而是按照 正负呢 如果按照 是不是三的倍数呢?
这里就要用函数指针了。。。好激动啊。。第一个用函数指针
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000;
//双指针 每次从前找偶数 从后找奇数 如果找到后发现start< end就交换
//函数指针的定义 返回值 括号内*func 后面括号返回值
bool isEven(int n)
{
return (n & 0x1)==0;
}
void ReorderWithDoublePointer(int arr[],int n,bool (*func)(int))
{
if(arr== NULL || n==0)
return ;
int * start=arr,*end=arr+n-1;
while(start<end)
{
while(start<end && !func(*start))//原来必须加0x 因为1 模式是bool的
start++;
while(start<end && func(*end))
end --;
if(start < end)
{
int tmp=* start ;
* start = * end;
*end =tmp;
}
}
}
void ReorderwithPartition(int arr[],int n,bool (*fun)(int))
{
if(arr==NULL || n==0)
return ;
int index=-1;
for(int i=0;i<n;++i)
{
if(!fun(arr[i]))//如果发现奇数 要移动到前面
{
index++;//这个奇数出现的位置应该是index
if(index!=i)//应该出现的位置和现在的位置不一样 要swap
{
int t=arr[index];
arr[index]=arr[i];
arr[i]=t;
}
}
}
}
int main()
{
int arr[maxn];
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;++i)
scanf("%d",&arr[i]);
// ReorderWithDoublePointer(arr,n,isEven);//这里直接输入函数名
ReorderwithPartition(arr,n,isEven);
for(int i=0;i<n;++i)
{
printf("%d\t",arr[i]);
}
printf("\n");
return 0;
}
}