二分查找算法

算法笔记–二分查找

二分查找是对有序序列查找的一种高效方法,时间复杂度为 log2(n),它的核心思想是分而治之,逐渐细化,最终匹配结果。

看图理解

  • 首先将数组对半分,判断目标值是在mid的左边,或者右边,或者等于mid值

  • 进一步细化,并采用同样的判断

  • 重复步骤,直至mid的值等于目标的值

案例实践

public class BinarySearch {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9};
        System.out.println("递归二分查找结果: " + search(a, 6));
        System.out.println("不使用递归二分查找结果: " + search2(a, 0, a.length - 1 , 6));
    }

    private static int search(int[] arr, int search){
        int n = arr.length;
        return search(arr,0,n - 1, search);
    }

    /**
     * @param arr
     * @param left    左边索引
     * @param right   右边索引
     * @param findVal 要查找的值
     * @return 未找到返回 -1,否则返回该值的索引
     */
    private static int search(int[] arr, int left, int right, int findVal) {
        // 当找不到时,则返回 -1
        if (left > right) {
            return -1;
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];
        // 相等则找到
        if (midVal == findVal) {
            return mid;
        }
        // 要查找的值在右边,则右递归
        if (findVal > midVal) {
            // mid 的值,就是当前对比的值,所以不需要判定
            return search(arr, mid + 1, right, findVal);
        }
        return search(arr, left, mid - 1, findVal);
    }


    /**
     * 不使用递归
     * @param arr
     * @param left
     * @param right
     * @param findVal
     * @return
     */
    private static int search2(int[] arr,int left,int right,int findVal)
    {
        while(left < right)
        {
            int mid = (left + right) / 2;
            if(arr[mid] < findVal){
                left = mid+1;
            }else {
                right = mid;    //一直让arr[right]>=findVal,最后剩下一个即为我们所要的解.
            }
        }
        return arr[right] == findVal ? right : -1;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值