二分查找的递归和非递归的实现

主要思想

文章内源码:源码链接
1.使用二分查找需要在一个顺序的数组中进行,进行查找的数组是有序的

2.主要思想是在查询时不是简单的从头遍历,而是从中间开始,比较要查找的值和数组中间的数值的大小,由于数组是有序的(假设是升序),如
果要找的值比中间值小,那么下一次就直接从中间值的左边找,这样就缩小了查找的范围,下次再从左边的范围进行二分查找,继续比较缩小范围.

代码实现

一.递归

public class BinarySearch {

    /** 
     * 二分查找
     * 思路:
     * 将一个有序的数组分割为两份,将要询找的值与数组中间的数据进行比较;
     * 如果要找的数比中间的数小就去左边找(这个和数组的升降序有关系);
     * 如果要找的数比中间的数大就去右边找;
     * 如果等于中间数就返回下标;
     * 如果没找到返回-1;
     * 注意:
     * 要判断退出递归的条件
     * 如果当左边的下标要小于右边右边的下标就说明已经递归完了
     * @param arr
     * @param left
     * @param right
     * @param findVal
     * @return
     */
    public int binarySearch(int[] arr , int left , int right , int findVal){
        // 获取中间的下标
        int mid = (left + right) / 2 ;
        // 如果做下标大于了右下表就应该退出递归开始返回
        if(left > right){
            return -1;
        }
        // 如果要找的数比中间的数小,就向右递归
        if(arr[mid] < findVal){
            return binarySearch(arr , mid + 1 , right , findVal);
            // 如果要找的数比中间的数大,就向左递归
        }else if (arr[mid] > findVal){
            return binarySearch(arr , left , mid - 1 , findVal);
            // 如果要找的数和中间相等,就返回下标
        }else if(arr[mid] ==findVal){
            return mid;
            // 如果都没有就说明没找到 返回-1
        }else{
            return -1;
        }
    }
}

二.非递归

public class BinarySearch {

    /**
     * 二分查找的非递归的方法
     * 思路:
     * 当做左下标小于等于右下标的时候就一直循环,
     * 在循环体中动态的改变mid的值
     * 每次循化都比较arr[mid]的值和要寻找值的大小,根据不同的情况来改变左下标和右下标的值
     * @param arr
     * @param value
     * @return
     */
    public int binarySearch(int[] arr , int value){
        // 初始化左下标
        int left = 0;
        // 初始化右下标
        int right = arr.length - 1;
        // 初始化中间的值
        int mid = 0 ;
        // 当左下标小于等于右下标的时候就说明可以一直找
        while(left <= right){
            // 先计算mid 的值
            mid = (left + right) / 2;
            // 判断不同的情况
            // 如果要找的值比中间值小,在左边
            if (value < arr[mid]){
                // 右下标的值进更换
                right = mid - 1;
            }else if(value > arr[mid]){ // 如果要找的值比中间值大,在右边
                // 左下标的值进行更换
                left = mid + 1;
            }else {
                // 如果相等的话就直接返回当前下标
                return mid;
            }
        }
        // 退出循环说明没找到,就返回-1
        return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值