【算法总结-数组】数组移动->左奇右偶
2011-11-01 14:05
357 查看
给定一个整形数组,要求对这个数组进行操作,移动成左边部分奇数,右边部分偶数的形式。
想法:快速排序的划分方法,原本是根据与某一个值进行比较进行划分。更改这个算法策略为根据每个数的奇偶性进行划分。
实现1:
实现2:
对于php,实现方式可以更简单,直接扫描数组,是奇数就放入左边数组left,否则放入右数组right,然后返回array_merge的结果
想法:快速排序的划分方法,原本是根据与某一个值进行比较进行划分。更改这个算法策略为根据每个数的奇偶性进行划分。
实现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); }
相关文章推荐
- 算法->《编程之美》2.18——数组分割新思路(包含分类后数组的输出)
- <跟着结构之法一起学算法>求子数组的最大和
- <算法书>子数组换位问题
- <iOS, Android>移动原型工具总结
- <Fast Tracking via Spatio-Temporal Context Learning> 阅读和算法使用总结
- php中的V->C传值,自动跳转页面,自动创建,数组的用法总结
- 【白话经典算法系列之十五】“一步千里”之数组找数<转>
- 【吐槽篇之经验<三>】性能问题定位与调优测试总结
- 给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的。
- 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和--算法求解
- 算法_已知五个>=0的自然数,随机输入5个数,编写算法判断是否能排列成有序的数字。0可以替换成任何数
- 【算法总结】Binary Tree & Binary Search Tree 二叉树
- 【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结
- <转>二十六个月Android学习工作总结(2013-05-02更新)
- <算法导论>学习笔记(3)--递归树求递归算法时间复杂度
- 算法题总结之找到数组中出现次数唯一不同的数字
- <菜鸟学算法-A排序(分治的思想:快速排序)>
- 视图动画学习算法和数据结构(二)(<Garry进阶(四)>)
- 算法: 求整数随机数构成的数组中找到长度>=3的最长的等差数列
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结