数组问题之数组最值问题<Java实现>
2012-11-26 11:35
507 查看
/** * 寻找数组的最大值和最小值问题 * @author Sking */ package 数组问题; public class 数组最值 { /** * 遍历数组法,比较次数2n次 * @param array 指定数组 * @return 包含有最大值和最小值的数组 */ public static int[] MaxAndMin0(int[] array){ int max=Integer.MIN_VALUE, min=Integer.MAX_VALUE; for(int i=0;i<array.length;i++){ if(array[i]>max) max=array[i]; if(array[i]<min) min=array[i]; } return new int[]{min,max}; } /** * 将数组分为两个部分,偶数索引位置存在相邻两元素中的较大值, * 奇数索引部分存在相邻两元素中的较小值,最后在偶数索引位置上 * 查找最大值,在奇数索引位置上查找最小值。 * 时间复杂度:比较次数1.5*n,交换次数n/2 * @param array 指定数组 * @return 最大值和最小值构成的数组 */ public static int[] MaxAndMin1(int[] array){ int max=Integer.MIN_VALUE, min=Integer.MAX_VALUE; for(int i=0;i<array.length-1;i+=2){ if(array[i]<array[i+1]){ //交换相邻两数,使大数位于偶数索引上 int temp=array[i]; array[i]=array[i+1]; array[i+1]=temp; } } for(int i=0;i<array.length;i+=2) if(array[i]>max) max=array[i]; for(int i=1;i<array.length;i+=2) if(array[i]<min) min=array[i]; return new int[]{min,max}; } /** * 将数组相邻元素进行概念上的分组,将两数中的较大值 * 与max比较并更新max的值,将两数中的较小值与min * 比较并更新min的值 * 时间复杂度:比较次数为1.5*n,但交换次数为0 * @param array 指定数组 * @return 最大值和最小值构成的数组 */ public static int[] MaxAndMin2(int[] array){ int max=Integer.MIN_VALUE, min=Integer.MAX_VALUE; for(int i=0;i<array.length-1;i+=2){ if(array[i]>array[i+1]){ if(array[i]>max) max=array[i]; if(array[i+1]<min) min=array[i+1]; }else{ if(array[i]<min) min=array[i]; if(array[i+1]>max) max=array[i+1]; } } if(array.length%2!=0){//数组个数为奇数,要处理最后一个元素 int t=array[array.length-1]; if(t>max) max=t; if(t<min) min=t; } return new int[]{min,max}; } /** * 递归分治方法查找数组中的最大值和最小值 * 性能:比较次数为1.5*n-2 * @param array 当前考虑数组段 * @param l 数组段的左端索引 * @param r 数组段的右端索引 * @return 指定数组中的最大值和最小值 */ public static int[] MaxAndMin3(int[] array,int l,int r){ if(r-l<=1){ if(array[l]<array[r]) return new int[]{array[l],array[r]}; else return new int[]{array[r],array[l]}; } int[] leftResult=MaxAndMin3(array,l,l+(r-l)/2); int[] rightResult=MaxAndMin3(array,l+(r-l)/2+1,r); return new int[]{Math.min(leftResult[0],rightResult[0]), Math.max(leftResult[1],rightResult[1])}; } }
相关文章推荐
- 数组问题之一维最大字段和问题<Java实现>
- 数组操作大全<Java实现>
- 数字问题之二进制1数问题<Java实现>
- 数字问题之斐波那契数列全解<Java实现>
- 【Java】ArrayList<String>转化为String数组问题
- 【Java】ArrayList<String>转化为String数组问题
- 数字问题之阶乘零数问题<Java实现>
- 在JavaScript中实现类似Java中List<Map>类型的数组
- 字符串问题之串移包含问题<Java实现>
- java实现<爬梯子>问题
- 链表问题之链表反转<Java实现>
- 八皇后问题之回溯算法实现<java实现>
- 链表问题之无头单链表删节点<Java实现>
- 集合转换java:【List<-->数组、List<-->Set、数组<-->Set、Map-->Set、Map-->List】
- Java实现从IP和端口列表List<String>获取分离的IP和端口值
- Java 中如何对 Iterator<Text> values 实现两次遍历
- 关于java中<T>问题
- 经典算法问题的java实现<一>
- 256 <--> 64算法 互转 ( Java实现)
- <<现代操作系统>>书本中的java实现生产者/消费者问题的代码改良