package com.yang.divide;
/**
* 分治法得到数组的最大最小值,核心思想在于将数组先划分为两个数组,然后比较两个数组的最大和最小(大的为最大值,小的为最小值)
* 然后分治下去,直到数组中的元素为两个时,大的为最大值,小的为最小值。也可以划分到只有一个元素(最大最小都是自己)。
*/
public class GetMinMaxByDivide {
// 内部类,方便得到最大值和最小值
public class MaxMain{
private int max;
private int min;
public MaxMain(int max, int min) {
this.max = max;
this.min = min;
}
public int getMax() {
return max;
}
public int getMin() {
return min;
}
}
// main方法,程序入口
public static void main(String[] args) {
new GetMinMaxByDivide().test();
}
/**
* 得到最大、最小
* @param a:操作的数组
* @param began:开始的下标
* @param end:结束的下标
* @return 含有最大值和最小值的对象
*/
public MaxMain getMaxMin(int[] a,int began,int end){
if(end-began<=1){
return a[began]<=a[end]?new MaxMain(a[end],a[began]):new MaxMain(a[began],a[end]);
}
else {
// 将数组分为两部分
int mid=began+(end-began)/2;
// 得到左边的最大、最小
MaxMain left=getMaxMin(a,began,mid);
MaxMain right=getMaxMin(a,mid,end);
// 定义两个局部变量,用来储存最大、最小值,以便实例MaxMin类返回结果
int max=0;
int min=0;
max=left.getMax()>= right.getMax()? left.getMax() : right.getMax();
min= left.getMin()<= right.getMin()? left.getMin() : right.getMin();
return new MaxMain(max,min);
}
}
// 测试数据
public void test(){
int[] a={1,3,56,0,22,32,61};
System.out.print("数组为:");
for(int arrays:a){
System.out.print(arrays+" ");
}
System.out.println();
MaxMain result=getMaxMin(a,0,a.length-1);
System.out.println("最大值:"+result.getMax());
System.out.println("最小值:"+result.getMin());
}
}
Java分治法求解最大最小
最新推荐文章于 2021-11-12 16:51:37 发布