题目:实现一个函数使所有奇数位于数组的前半部分,偶数在数组的后半部分。
思路:使用两个指针begin ,end,begin指向数组的的第一个数,end指向数组的最后一个数。当(begin <= end )时,如果begin指向的数是奇数,begin++。如果end所指向的数是偶数,end–;交换begin和end所指向的值。
使用函数指针,是代码具有可扩展性,可以解决一类相同模式的问题。比如,使所有的负数位于正数的前面。使所有能被2整除的数位于不能被2整除的数的后面等。只需要修改函数指针fun所指向的函数。代码整体不需要修改。
#include<iostream>
using namespace std;
bool IsOdd(int n) //判断是否为奇数
{
return (n & 1) == 1;
}
void ReOrder1(int *arr, int len, bool (*fun)(int))
{
int begin = 0;
int end = len - 1;
while (begin <= end)
{
while ( begin <= end && fun(arr[begin]))//如果是奇数++
begin++;
while (begin <= end && !fun(arr[end])) //如果是偶数--
end--;
if (begin < end)
{
swap(arr[begin], arr[end]);
begin++;
end--;
}
}
}
void ReOrder(int *arr, int len)
{
ReOrder1(arr, len, IsOdd);
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int len = sizeof(arr) / sizeof(arr[0]);
ReOrder(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
getchar();
return 0;
}