【最值查找】请设计一个分治算法,从一个长度为n的整数序列中搜索最大元素和最小元素。
算法设计思路
递归把数组分成两个两个对比,比较完排好序,存到一个数组中,然后最大的跟全局变量max比较,最小的跟全局变量min比较,整个数组比较完后则得出序列中最大元素和最小元素
算法实现的伪代码
算法cut( int arr[ ], int first, int end )
输入:待选数组、数组首位下标、数组末位下标
输出:最大数和最小数
- mid = (first +end ) /2
- if(一个数或者是两个数作比较)
- 比较compare( arr,first,end )传出来的数组里的两个数与max和min的大小
- 较大的数比max大则将其赋值到max中
- 较小的数比min小则将其赋值到min中
- cut(arr,first,mid)
- cut(arr,mid+1,end)
实现代码
public class Main {
static int max = 0,min = 0;
public static void main(String[] args) {
int[] arr = {5, 4, -2, 3, 6, 1, 7,1,2,3,4,5,6,6,7,8,1,3,4,2,2,4,3,345345,3,345,53,-231231,423};
max = arr[0];
min = arr[0];
cut(arr, 0, arr.length - 1);
System.out.println("MAX:"+max);
System.out.println("MIN:"+min);
}
public static void cut(int[] arr, int first, int end) { //递归分割
int mid = (first + end) / 2;
if (end - first == 1 || end - first == 0) { //分割成一个数或者两个数
int[] mm;
mm = compare(arr, first, end); //接收两个数大小比较的结果
if(arr[mm[0]]>max)
max = arr[mm[0]];
if(arr[mm[1]]<min)
min = arr[mm[1]];
} else { //前半段和后半段递归
cut(arr, first, mid);
cut(arr, mid + 1, end);
}
}
public static int[] compare(int[] arr, int index1, int index2) { //对比然后排序,大的放前面,小的放后面,然后返回数组
int[] maxmin = new int[2];
if (arr[index1] > arr[index2]) {
maxmin[0] = index1;
maxmin[1] = index2;
} else {
maxmin[1] = index1;
maxmin[0] = index2;
}
return maxmin;
}
}
写得不好,多请谅解!