调整数组顺序使奇数位于偶数前面
2015-06-07 14:09
489 查看
【题目】
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
【分析】
比较直接的笨方法就是遍历每一个,只要是偶数,就拿出来,将后面的数依次往前挪动,将偶数填放在数组的最后方,每碰到一个偶数就要挪动o(n)个数字,那么总的时间复杂度就是O(n^2),效率太低,如何改善,可以观察数组如果要奇数位于偶数之前,也就是顺序颠倒的要换过来,从两头往中间遍历的方法比较简单,只要不符合奇在偶前,那么就要颠倒,否则就往中间继续查找遍历,直到发现所有都满足条件。
举例分析,数组{1,2,3,4,5},最终想得到的是奇数在前,偶数在后,这里不关注排序的问题,所以,参考下面过程图就可理解怎么快速调整顺序。
最终得到的结果就是{1,5,3,4,2}
【测试代码】
【延伸】
如果此题目做一下变化,比如把筛选条件换成让所有能被3整除的位于不能被3整除的前面,或者满足负数在非负数前面等,上面的代码相应部分的筛选条件就随要求变化即可,但是,怎么能让我们的程序普适性更好呢,就是类似的这样的问题用我们的代码就直接可以解决,不用老是修改,能想到的是将筛选条件提取出来单独成为一个函数,在这测试代码只需要调用你要判断的条件函数就可以了,无需更改,于是,我们改写出了如下代码:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
【分析】
比较直接的笨方法就是遍历每一个,只要是偶数,就拿出来,将后面的数依次往前挪动,将偶数填放在数组的最后方,每碰到一个偶数就要挪动o(n)个数字,那么总的时间复杂度就是O(n^2),效率太低,如何改善,可以观察数组如果要奇数位于偶数之前,也就是顺序颠倒的要换过来,从两头往中间遍历的方法比较简单,只要不符合奇在偶前,那么就要颠倒,否则就往中间继续查找遍历,直到发现所有都满足条件。
举例分析,数组{1,2,3,4,5},最终想得到的是奇数在前,偶数在后,这里不关注排序的问题,所以,参考下面过程图就可理解怎么快速调整顺序。
最终得到的结果就是{1,5,3,4,2}
【测试代码】
#include<stdio.h> void swap(int *p1, int *p2) { } void reorder_odd_even(int *p, int length) { int *p1 = p; int *p2 = p+length - 1; while(p1<p2) { while(( *p1 & 0x1 !=0 )&&(p1<p2)) p1++; while((*p2&0x1) == 0 && (p1<p2)) p2--; if(p1<p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } } } void print(int s[],int length) { for(int i = 0; i<length; i++) printf("%d",s[i]); } int main() { int s[ ] = {1,2,3,4,5}; reorder_odd_even(s,5); print(s,5); return 0; }
【延伸】
如果此题目做一下变化,比如把筛选条件换成让所有能被3整除的位于不能被3整除的前面,或者满足负数在非负数前面等,上面的代码相应部分的筛选条件就随要求变化即可,但是,怎么能让我们的程序普适性更好呢,就是类似的这样的问题用我们的代码就直接可以解决,不用老是修改,能想到的是将筛选条件提取出来单独成为一个函数,在这测试代码只需要调用你要判断的条件函数就可以了,无需更改,于是,我们改写出了如下代码:
#include<stdio.h> bool isEven(int n) { return (n&1)==0; } void reorder(int *p, int length,bool (*func)(int)) { int *p1 = p; int *p2 = p+length - 1; while(p1<p2) { while(!func(*p1)&&(p1<p2)) p1++; while(func(*p2) && (p1<p2)) p2--; if(p1<p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } } } void reorder_odd_even(int s[], int length) { reorder(s,length,isEven); } void print(int s[],int length) { for(int i = 0; i<length; i++) printf("%d",s[i]); } int main() { int s[ ] = {1,2,3,4,5}; reorder_odd_even(s,5); print(s,5); return 0; }
相关文章推荐
- 关于marked数组处理
- 排序应用--归并排序
- Struts2中的ModelDriven机制及其运用
- hdu 1104 Remainder 队列
- 寻找数列中的1
- hdu 1104 Remainder 队列
- Android Studio如何导入Github上的项目
- ubuntu下安装配置JDK
- 不要再坑人啦!NSOperation才是苹果推荐使用的多线程技术!
- Eclipse新建Android项目时,出现appcompat_v7工程错误和红色感叹号(提示一堆style错误)
- 十三周——输入输出流——阅读
- 书写是为了更好的思考~
- 去掉CI默认url中的index.php
- Windows在结构Eclipse+Android4.0开发环境
- 事务的生命周期与事务模式(autocommit)
- keil生成bin文件
- 自定义优先队列
- PHP “Warning: session_start()...” 的解决方法
- 为什么我们常说很多时候一定要亲身经历了之后才能明白?
- House Robber