Java分治法求解最大最小

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());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值