首页 > 代码库 > 无序数组同时查找最大和最小的元素

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

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



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