无序数组同时查找最大和最小的元素

来源:互联网 发布:新浪数据库 股票 编辑:程序博客网 时间:2024/05/02 15:28

在无序数组中查找最大或者最小的元素都需要进行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;}



0 0