调整数组顺序使奇数位于偶数前面
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. 条件变换时,代码的扩展性和可重用性这里体现得很好。
//使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#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. 条件变换时,代码的扩展性和可重用性这里体现得很好。
相关文章推荐
- 获得矩阵行列数的方法
- Java字符串编码与解码
- JS获取鼠标位置、当前元素所在位置
- Android自定义控件2:自定义带下划线的文本或按钮、组合使用可切换tab
- 垂直progressbar 实现
- 【bzoj 1611】 [Usaco2008 Feb]Meteor Shower流星雨 bfs
- nginx学习笔记四(nginx启动时候的master和worker进程)
- Paxos分析
- Appium使用教程_Android篇
- sqlserver 触发器 怎么获取更新前的值
- 设计模式之开放关闭原则
- js获取url传递参数
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- 通过设置虚拟机(ubantu15.10)的分辨率达到全屏效果
- netstat
- part1:11-linux在线安装工具yum
- S3c6410 平台 Android系统的Wi-Fi调试记录
- 如何消除<a>标签在点击时的蓝色底色?
- Wireshark Filter的用法
- 移植好的rtthread+lwip的mac地址修改方式