核心思想: 假设数组中有n个元素,n有两种情况:
1. 若n是奇数,就将最大值和最小值的初值都设为第一个元素的值。
2.若n是偶数,就将数组中前两个元素互相比较一次,将最小值的初值设定成较小者,将最大者的初值设定成较大者。
最后,在n分完奇偶,且最大值最小值设定完后,将余下的元素成对的处理,即两个两个元素相互比较,较小者设为最小值,
较大者设为最大值。
则循环n-1次后得出最大最小值。
/** * 算法导论 同时求出最大值最小值的方法: * 总的比较次数至多是3(n/2) 括号里向下取整 * */ public class TestFive { // 该函数用于选择出最大最小值的初值 public static void num(int[] a) { int n = a.length; int min; //初始最小值 int max; //初始最大值 int first; //标记余下未比较的元素的开始位置 if(n%2==0) { //若n为偶数 if(a[0]<a[1]) { //比较数组前两位元素,较小者为min,较大者为max min = a[0]; max = a[1]; } else { min = a[1]; max = a[0]; } first = 2; } else { //若n为奇数,则将min和max都初始化为第一个元素 min = a[0]; max = a[0]; first = 1; } select(a,first,min,max); } /** * @param a 存储元素 * @param first 余下元素的开始位置 * @param min 初始的最小元素值 * @param max 初始的最大元素值 */ public static void select(int[] a,int first,int min,int max) { int p = min; //最小值 int q = max; //最大值 for(int i=first;i<a.length-1;i++) { //余下的元素,两两互相比较,较小者再与最小值比较,较大者与最大值比较 //依次比较选择出最大最小值 if(a[i]<a[i+1]) { if(a[i]<p) p = a[i]; if(a[i+1]>q) q = a[i+1]; } else { if(a[i]>q) q = a[i]; if(a[i+1]<p) p = a[i+1]; } } System.out.println("最小值: " + p); System.out.println("最大值: " + q); } public static void main(String[] args) { int[] a = {10,5,6,-5,1,6,4}; num(a); } }