在无序数组中查找最大或者最小的元素都需要进行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;
}
原文地址:http://blog.csdn.net/zbao6062/article/details/43237149