调整数组顺序使奇数位于偶数前面
来源:互联网 发布:海龟交易系统源码 编辑:程序博客网 时间:2024/06/06 14:44
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分:
基本思路:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n2)。
高效解法:借鉴快速排序的思想,通过设置两个指针来进行交换操作,从而减少移动次数,提高效率.
- 第一个指针初始化时指向数组的第一个数字,它只向后移动;
- 第二个指针初始化时指向数组的最后一个数字,它只向前移动。
- 在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,我们就交换这两个数字。
void ReorderOddEven(int[] arr) { int i=0,j=arr.length-1; while(i<j) { while((i<j)&& (arr[i] & 0x1)!=0) i++; while(i<j && (arr[j] & 0x1)==0) j--; swap(arr,i,j); } } void swap(int[] arr,int i,int j){ int k=arr[j]; arr[j]=arr[i]; arr[i]=k; }
如果题目改成讲数组中按照大小分成两部分,所有负数在非负数前面,或者如果改成能被3整除的数都在不能被三整除的前面,改怎么办,这里将isEvent提取出来,这是个规则,便于扩展到同类型问题上
void ReorderOddEven(int[] arr) { int i=0,j=arr.length-1; while(i<j) { while((i<j)&& isEvent(arr[i])) i++; while(i<j && isEvent(arr[j])) j--; swap(arr,i,j); } } void swap(int[] arr,int i,int j){ int k=arr[j]; arr[j]=arr[i]; arr[i]=k; } private boolean isEvent(int n){ return (n&1)==0; }
参考文章http://blog.csdn.net/smartbrave/article/details/51635757
0 0
- 【数组3】-调整数组顺序使奇数位于偶数前面
- 数组3:调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面--总结
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面[
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使偶数位于奇数前面
- coding - 调整数组顺序使奇数位于偶数前面
- 【JZOJ4858】【GDOI2017模拟11.4】Walk
- 【codevs 1092】不高兴的津津
- HDU 1754 I Hate It
- 必须了解的浏览器渲染性能
- 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译
- 调整数组顺序使奇数位于偶数前面
- zabbix从2.6到3.0 脚本参数设置的变化
- Linux C——select函数详解及其应用
- 文件操作
- Twisted学习(二)--------------构造Deferreds
- 计算点云的最小BBOX
- 《Android 群英传》读书笔记:自定义 View 之创建复合控件
- 形参与实参
- FATAL ERROR: MarkCompactCollector: semi-space copy, fallback in old gen Allocation failed - JavaScri