核心思想: 假设数组中有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 余下元素的开始位置
* @