题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
实现这个功能很简单,关键是考虑问题要考虑周全,数组为空,数组只有一个奇数,数组只有一个偶数,数组有两个数前奇后偶,数组有两个数前偶后奇,数组有多个数字
有很多的此类的问题,例如:
(1)把负数放到正数前面
(2)能被3整除的放在不能被3整除的数前面
等等,这只是里面的判断规则不一样,这样的话我们提供一个模板就可以了,就可以使用一个函数来实现这些操作,当然要借助函数指针,具体实现如下:
#include <iostream>
using namespace std;
//修改为可以适合其他规则的一个模板,这就需要使用函数指针
void ReOrderOddEven(int data[], int length, bool (*func)(int ))
{
if(data==NULL || length<0)
return ;
int pOdd = 0;
int pEven = length-1;
while(pEven > pOdd)
{
//定位pOdd的位置,指向第一个偶数
while((pOdd < pEven) && (*func)(data[pOdd]))
{
++pOdd;
}
//定位pEven的位置,指向第一个奇数
while((pOdd < pEven) && !(*func)(data[pEven]))
{
--pEven;
}
if(pEven > pOdd)
{//交换
int temp = data[pEven];
data[pEven--] = data[pOdd];
data[pOdd++] = temp;
}
}
}
bool isOdd(int number)
{
return number&1;
}
void printArray(int data[], int length)
{
for(int i=0; i<length; ++i)
{
cout<<data[i]<<endl;
}
cout<<endl;
}
int main()
{
int data[] = {1};
ReOrderOddEven(data,1,isOdd);
printArray(data,1);
int data1[] = {2};
ReOrderOddEven(data1,1,isOdd);
printArray(data1,1);
int data2[] = {1,2};
ReOrderOddEven(data2,2,isOdd);
printArray(data2,2);
int data3[] = {2,1};
ReOrderOddEven(data3,2,isOdd);
printArray(data3,2);
int data4[] = {1,2,3,4,5};
ReOrderOddEven(data4,5,isOdd);
printArray(data4,5);
ReOrderOddEven(NULL,0,isOdd);
return 0;
}