您的位置:首页 > 其它

调整数组顺序使奇数位于偶数前面

2016-05-16 16:40 197 查看
//输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
//使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#include "helper.h"

//前后指针
void reorderArray0(int a[], int n)
{
if (a == NULL || n == 0)
return;
int evenFirst = 0;
while (a[evenFirst] & 1)
evenFirst++;
for (int i = evenFirst + 1; i < n; i++)
{
if (a[i] & 1)
{
myswap(&a[evenFirst], &a[i]);
evenFirst++;
}
}
}
//双端指针
void reorderArray1(int a[], int n)
{
if (a == NULL || n == 0)
return;
int pBegin = 0;
int pEnd = n - 1;
while (pBegin <= pEnd)
{
while ((a[pBegin] & 1) && pBegin <= pEnd)
{
pBegin++;
}
while (!(a[pEnd] & 1) && pBegin <= pEnd)
{
pEnd--;
}
if (pBegin < pEnd)
myswap(&a[pBegin++], &a[pEnd++]);
}
}
//扩展,基础方法用前后指针
//判断条件
bool forwardFunc(int num)
{
if (num & 1)
return true;
else
false;
}
void reorderArray2(int a[], int n)
{
if (a == NULL || n == 0)
return;
int evenFirst = 0;
while (forwardFunc(a[evenFirst]))
evenFirst++;
for (int i = evenFirst + 1; i < n; i++)
{
if (forwardFunc(a[i]))
{
myswap(&a[evenFirst], &a[i]);
evenFirst++;
}
}
}
//更好的解决方法
void reorderArray2(int a[], int n, bool (*Func)(int))
{
if (a == NULL || n == 0)
return;
int evenFirst = 0;
while (Func(a[evenFirst]))
evenFirst++;
for (int i = evenFirst + 1; i < n; i++)
{
if (Func(a[i]))
{
myswap(&a[evenFirst], &a[i]);
evenFirst++;
}
}
}

void reorderOddEven(int a[], int n)
{
reorderArray2(a, n, forwardFunc); //这样不需要改forwardFunc函数,
} //只需要传入不同的函数指针就OK.

void test()
{
int a[] = { 1, 2, 4, 6, 9, 3, 10, 8 };
//int a[1] = { 1 };
//int a[2] = { -1, -4 };
reorderArray2(a, sizeof(a) / sizeof(int));
arrayPrint(a, sizeof(a) / sizeof(int));
}

int main()
{
test();
return 0;
}

1. 注意条件的判断,a==null和数组为空情况的判断。
2. 条件变换时,代码的扩展性和可重用性这里体现得很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: