首页 > 代码库 > 无序数组同时查找最大和最小的元素
无序数组同时查找最大和最小的元素
在无序数组中查找最大或者最小的元素都需要进行n次比较,但是同时查找最大和最小的元素却可以在3n/2次比较内实现。
问题:给定一个长度为n的无序序列,同时查找出这个序列中的最大和最小值。
算法设计:如果只是在无序序列中查找最大或最小值,至少需要n-1次比较,但是同时查找出最大值和最小值却不需要2(n-1)次比较,而只需要3n/2次比较。其策略是:同时保存当前得到的最大值和最小值,之后依次从无序序列中取出两个数并进行比较,其中较小的一个与当前的最小值比较,较大的一个于当前的最大值比较,然后更新当前的最大值和最小值,按照这个过程,每两个元素需要进行3次比较,于是总的比较次数就是3n/2。
为了保证之后的元素有偶数个,设定最大值和最小值的初值时需要结合n的奇偶性,若n为奇数,则最大值和最小值的初值都取第一个元素,若n为偶数,则首先比较序列的前两个元素,较小的一个作为最小值的初值,较大的一个作为最大值的初值。
//x存放无序序列的数组 min最小值 max最大值 n数组长度 private static void findMaxAndMin(int[] x,int n){ int min; int max; int i; if(n%2 == 0){ //设定初值,n为偶数的情况 if(x[0] < x[1]){ min = x[0]; max = x[1]; }else{ max = x[0]; min = x[1]; } i = 2; //已经有两个元素参与过比较 }else{ //n为奇数 ,已经有一个元素参与过比较 min = x[0]; max = x[0]; i = 1; } while(i < n){ //每次取两个元素递推 if(x[i] < x[i+1]){ min = (x[i] < min) ? x[i] : min; max = (x[i+1] < max) ? max : x[i+1]; }else{ min = (x[i+1] > min) ? min : x[i+1]; max = (x[i] > max) ? x[i] : max; } i = i + 2; //又有两个元素参与比较 } System.out.println("min = "+ min); System.out.println("max = "+ max); return; }
无序数组同时查找最大和最小的元素
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。