【算法总结-数组】数组移动->左奇右偶
来源:互联网 发布:恢复断开的网络驱动器 编辑:程序博客网 时间:2024/06/05 18:59
给定一个整形数组,要求对这个数组进行操作,移动成左边部分奇数,右边部分偶数的形式。
想法:快速排序的划分方法,原本是根据与某一个值进行比较进行划分。更改这个算法策略为根据每个数的奇偶性进行划分。
实现1:
/* *数组移动,偶数移动到右边,奇数在左边 *方式1:用类似与快速排序划分的方式 *用一个指针扫描,遇到奇数就与已移动过的部分的下一个元素交换(另一个指针保存着已移动好的奇数的右边界) *扫描一次即可完成,时间复杂度O(N),空间O(1) */ void partition(int arr[],int n){ int i = -1,end = n-1; for(int j = start;j<=end;j++){ if(arr[j]%2==1){ i++; if(i!=j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;} } } }
实现2:
int partition(int arr[],int n){ int i = 0; int j = n-1; while(i<j){ while(i<j && (arr[i]%2==1)) i++; while(i<j && (arr[j]%2==0)) j--; if(i<j){ swap(&arr[i],&arr[j]); } } return i;//返回偶数开始的索引,可以不返回}
对于php,实现方式可以更简单,直接扫描数组,是奇数就放入左边数组left,否则放入右数组right,然后返回array_merge的结果
/* *方式二:对于php来说,处理方式可以更简单. *直接扫描数组,如果是奇数就把值放入left_array,否者放入right_array.然后返回merge的结果 *缺点是需要O(N)的额外空间 */ function partition($arr){ $left = array(); $right = array(); for($j = 0;$j<count($arr);$j++){if($arr[$j]%2==1){ $left[] = $arr[$j];}else{ $right[] = $arr[$j];} } return array_merge($left,$right); }
- 【算法总结-数组】数组移动->左奇右偶
- 数组移动算法
- 数组移动算法
- 数组算法的总结
- 字符串、数组 算法总结
- js数组算法总结
- 数组移动
- 数组移动
- 【算法思想】循环移动一个数组
- 小算法--数组中元素的移动
- KMP算法中的模式串移动数组
- javascript常用数组算法总结
- javascript常用数组算法总结
- javascript常用数组算法总结
- javascript常用数组算法总结
- JavaScript常用数组算法总结
- 【有趣的面试算法题】 数组循环移动算法细究
- 【算法总结-数组相关】 数组中找特定元素相关~
- 《乔布斯传》缘何从中国书店飞速消失?
- js实现的3D效果
- 引用 JSP filter过滤器的功能简要介绍
- 世界之窗3的广告过滤规则 2013.5.31更新
- C#中使用DOS命令关闭当前正在运行的程序并重新启动
- 【算法总结-数组】数组移动->左奇右偶
- Vmware环境下Linux与ARM开发板的NFS系统搭建[图文]
- String与StringBuffe
- CreateThread、_beginthread和_beginthreadex区别
- [续]java爬虫程序出现的exception
- 做菜、软件设计与管理
- Android 怎么退出整个应用程序?
- Android应用程序线程消息循环模型分析
- 升级xcode3到xcode4遇到的一些问题 和 解决方法