题目:调整数组顺序,使奇数位于偶数前面。
输入一个整形数组,实现一个函数调整数组中数字顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
整体思路:
思路1:
扫描数组,前指针指向第一个数字,向后走;后指针指向最后一个数字,向前走,若偶数在奇数前面,交换这两数字。
代码:
#include<stdio.h>
void ReoederOddEven(int *pData, unsigned int length)
{
if (pData == NULL || length == 0)
{
return;
}
int *pBegin = pData;
int *pEnd = pData + length - 1;
while (pBegin < pEnd) // *pBegin *pEnd 代表里面的数字
{
while (pBegin < pEnd && (*pBegin & 0x1)!=0) //向后移动begin,直到它指向偶数
{
pBegin++;
}
while (pBegin < pEnd && (*pEnd & 0x1)==0)//向前移动pEnd,直到它指向奇数
{
pEnd--;
}
if (pBegin < pEnd) // 交换偶数和奇数
{
int t = *pBegin;
*pBegin = *pEnd;
*pEnd = t;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5 };
ReoederOddEven(arr, sizeof(arr) / sizeof(arr[0]));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
运行结果:
1 5 3 4 2
思路2:
函数指针写法,可提高扩展性
为了让代码的扩展性更强,可以将这些判断标准单独写成一个函数接口,而主代码框架保持不变。
将逻辑框架抽象出来,把判断标准变成一个函数指针,也就是用一个函数来判断数字是不是符合标准。
代码:
#include<stdio.h>
bool isEven(int n);
void ReoederOddEven(int *pData, unsigned int length);
void Reorder(int *pData, unsigned int length, bool(*func)(int));
bool isEven(int n)// 1&1 奇数 1==0 ? 1≠0 返回 0 说明是奇数
{
return(n & 1) == 0;
}
//把函数指针当成一个参数,声明了一个指针func,指向了函数 调用 func(3,4)或(*func)(3,4)
void Reorder(int* pData, unsigned int length, bool(*func)(int))
{
if(pData==NULL||length==0)
{
return;
}
int *pBegin = pData;
int *pEnd = pData + length - 1;
while (pBegin < pEnd) // *pBegin *pEnd 代表里面的数字
{
// !func(*pBegin)表示 *pBegin %2 != 0
while (pBegin < pEnd && !func(*pBegin)) //向后移动begin,直到它指向偶数
{
pBegin++;
}
// func(*pEnd) 表示 *pEnd % 2 == 0
while (pBegin < pEnd && func(*pEnd))// 向前移动pEnd,直到它指向奇数
{
pEnd--;
}
if (pBegin < pEnd) // 交换偶数和奇数
{
int t = *pBegin;
*pBegin = *pEnd;
*pEnd = t;
}
}
}
void ReoederOddEven(int *pData, unsigned int length)
{
Reorder(pData, length, isEven);
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
ReoederOddEven(arr1, sizeof(arr1)/sizeof(arr1[0]));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
运行结果:
1 5 3 4 2