Java二分法查找最大值

 Java二分法查找最大值

目录

1,二分法查找最大值的实现思路

2,二分法查找最大值的重点

3,二分法查找最大值java实现

代码:

结果:

4,另一种递归的实现:

 总结:


   二分法查找最大值,跟直接遍历并没有多大的区别,主要是使用的思路。理解了归并排序,查找最大值的就简单多了。

1,二分法查找最大值的实现思路

1,将要排序的n个内容,看成n个长度为1的有序表

2,将n个有序列表,拆分为n/2个长度为2的有序列表

3,重复2 的操作,直到所有记录n/2为1或2,可以进行值比较的两个值

4,将拆分的有序列表进行判断,留下大的值。

 

比如有一组的数字:25, 5, 83, 99, 28, 57, 95, 57, 35, 3

分割和归并的过程如图:

 

 

2,二分法查找最大值的重点

由图可以看出,拆分是比较容易的,找最大值也简单。

// 定义一个比较两个数值大小的函数
private static int compare(int a,int b){
    System.out.println("第"+(++number)+"趟进行比较:\t");
    return a>b?a:b;
}

1,找临界点,因为比较最少要两个值:

if (left > right - 2) { // 小于等于两个值
    System.out.println("left value:  "+ dataArr[left] + "  right value: "+  dataArr[right]);
    max = compare(dataArr[left], dataArr[right]);
}

 

2,得到左右两边最大的值进行比较

int mid = (left + right) / 2;
int leftMax = getMax(dataArr, left, mid);
int rightMax = getMax(dataArr, mid + 1, right);
System.out.println("left max:  "+ leftMax + " right max "+  rightMax);
max = compare(leftMax, rightMax);

 

3,二分法查找最大值java实现

代码:

public class BinaryFindMax {
    private static int number=0;
    public static void main(String[] args) {
        int[] data = {25, 5, 83, 99, 28, 57, 95, 57, 35, 3 };
        int max = getMax(data, 0, data.length - 1);
        System.out.println("max value: "+max);
    }

    /**
     * 用递归算法求数组中的最大值
     *
     * @param dataArr     数组
     * @param right   数组下标
     * @param right 数组上标
     * @return
     */
    public static int getMax(int[] dataArr, int left, int right) {

        int max;
        if (left > right - 2) { // 小于等于两个值
            System.out.println("left value:  "+ dataArr[left] + "  right value: "+  dataArr[right]);
            max = compare(dataArr[left], dataArr[right]);
        } else {
            int mid = (left + right) / 2;
            int leftMax = getMax(dataArr, left, mid);
            int rightMax = getMax(dataArr, mid + 1, right);
            System.out.println("left max:  "+ leftMax + " right max "+  rightMax);
            max = compare(leftMax, rightMax);
        }
        return max;

    }

    // 定义一个比较两个数值大小的函数
    private static int compare(int a,int b){
        System.out.println("第"+(++number)+"趟进行比较:\t");
        return a>b?a:b;
    }

}

 

结果:

left value:  25  right value: 5

第1趟进行比较:

left value:  83  right value: 83

第2趟进行比较:

left max:  25 right max 83

第3趟进行比较:

left value:  99  right value: 28

第4趟进行比较:

left max:  83 right max 99

第5趟进行比较:

left value:  57  right value: 95

第6趟进行比较:

left value:  57  right value: 57

第7趟进行比较:

left max:  95 right max 57

第8趟进行比较:

left value:  35  right value: 3

第9趟进行比较:

left max:  95 right max 35

第10趟进行比较:   

left max:  99 right max 95

第11趟进行比较:   

max value: 99

 

4,另一种递归的实现:

private static int max(int a,int b){   //定义一个比较两个数值大小的函数
    return a>b?a:b;
}
// 用数组的第一个值作为初始值
// 然后从数组的二个值开始,开始递进到最后一个值,然后回归,不断进行两两比较
public static int getMaxNum(int[] arr,int startIndex){
    if(startIndex==arr.length){
        return arr[0];
    }
    return max(arr[startIndex],getMaxNum(arr,startIndex+1));
}
public static void main(String[] args){
    int array[]= {162,233,77,99,69,56,89,174,86,78};
    System.out.print(getMaxNum(array,0));
}

 

 总结:

     二分法查找最大值,本身不具有什么样的优势。主要是“分治”方法的一种应用。当作练习还是不错的。

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值