Java实现利用分治法找到数组中的最大最小元素
基本思路:
不断的寻找数组的左子数组和右子数组,当左子数组和右子数组的长度为1时,最大最小元素均为本身,当左子数组和右子数组的长度为2时,直接进行一次比较分别得出两个子数组的最大最小元素,然后将子问题合并,在两个子数组中寻找到更大的元素作为大元素,更小的元素作为小元素,递归完成后,即可获得正确结果。
Java代码如下:
public class FindMaxAndMin {
public static void main(String[] args) {
int[] ans = {6, 8, 4, 4, 6, 36, 673, 13, 6, 7, 3, 4, 6, 8, 3, 7, 5, 7, 9, 5};
int[] res = find(ans, 0, ans.length - 1);
System.out.println("最小元素为"+res[0]);
System.out.println("最大元素为"+res[1]);
}
private static int[] find(int[] ans, int left, int right) {
int mid = (left + right) / 2;
//当left == right 时,最大最小元素均为ans[left]
if (left == right) {
int[] res = new int[2];
res[0] = ans[left];
res[1] = ans[right];
return res;
}
//当left + 1 == right时,比较得出最大最小元素
if (right - left == 1) {
int[] res = new int[2];
res[0] = Math.min(ans[left], ans[right]);
res[1] = Math.max(ans[left], ans[right]);
return res;
}
//分别找出左子数组和右子数组的最大最小元素
int[] Lres = find(ans, left, mid);
int[] Rres = find(ans, mid + 1, right);
//将子问题合并,找出两个子数组中的最小元素和最大元素
int[] res = merge(ans, Lres, Rres, left, mid, right);
return res;
}
private static int[] merge(int[] ans, int[] Lres, int[] Rres, int mid, int left, int right) {
int[] res = new int[2];
res[0] = Math.min(Lres[0], Rres[0]);
res[1] = Math.max(Lres[1], Rres[1]);
return res;
}
}