public class Pair {
private int max;
private int min;
public Pair(int max, int min) {
this.max = max;
this.min = min;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public void print() {
System.out.println("[" + this.max + "," + this.min + "]");
}
}
public class SearchMinAndMaxFormArray {
//方法1:遍历两次数组,分别找出最大值和最小值。需要进行 2 * N 次比较
public static Pair function1(int[] arr) {
int max = arr[0] > arr[1] ? arr[0]:arr[1];
int min = arr[0] < arr[1] ? arr[0]:arr[1];
//开始循环查找
for(int i = 2; i < arr.length; i ++) {
if(arr[i] < min) {
min = arr[i];
}
if(arr[i] > max) {
max = arr[i];
}
}
Pair pair = new Pair(max, min);
return pair;
}
//方法2:分组
public static Pair function2(int[] arr) {
Pair pair = null;
int max = 0;
int min = 0;
if(arr.length % 2 == 0) {
//计算分组,取整
int pairSum = arr.length / 2;
//使用第一个分组初始化max & min
max = arr[0] > arr[1] ? arr[0]:arr[1];
min = arr[0] < arr[1] ? arr[0]:arr[1];
//遍历分组数
int tempMax = Integer.MAX_VALUE;
int tempMin = Integer.MAX_VALUE;
for(int i = 2; i <= pairSum; i ++) {
//得到每个分组中的最大值和最小值
tempMax = arr[2 * i - 2] > arr[2 * i - 1] ? arr[2 * i - 2]:arr[2 * i - 1];
tempMin = arr[2 * i - 2] < arr[2 * i - 1] ? arr[2 * i - 2]:arr[2 * i - 1];
//更新整个数组中的最大值和最小值
if(tempMax > max) {
max = tempMax;
}
if(tempMin < min) {
min = tempMin;
}
}
} else {
max = max > arr[arr.length - 1] ? max : arr[arr.length - 1];
min = min < arr[arr.length - 1] ? min : arr[arr.length - 1];
}
pair = new Pair(max, min);
return pair;
}
//方法3:分制
public static Pair function3(int[] arr, int begin, int end) {
Pair pair = null;
int max = 0;
int min = 0;
if(begin + 1 >= end) {
max = arr[begin] > arr[end] ? arr[begin]:arr[end];
min = arr[begin] < arr[end] ? arr[begin]:arr[end];
} else {
int middle = (begin + end + 1) / 2;
Pair left = function3(arr, begin, middle);
Pair right = function3(arr, middle + 1, end);
max = left.getMax() > right.getMax() ? left.getMax():right.getMax();
min = left.getMin() < right.getMin() ? left.getMin():right.getMin();
}
pair = new Pair(max, min);
return pair;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] arr = {2, 3, 1, 5, 6, 9, 7, 8};
SearchMinAndMaxFormArray.function1(arr).print();
System.out.println("====================");
SearchMinAndMaxFormArray.function2(arr).print();
System.out.println("====================");
SearchMinAndMaxFormArray.function3(arr, 0 , arr.length - 1).print();
}
}