二分查找算法思想及实现

二分查找
二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的思想是不断将待查找区间分成两部分,并通过比较目标值与中间元素的大小关系来确定目标值可能存在的区间,从而缩小搜索范围,直到找到目标值或确定目标值不存在为止。
具体步骤如下:

  1. 确定搜索范围:首先确定整个数组的搜索范围,通常是设置两个指针,一个指向起始位置,另一个指向末尾位置。
  2. 计算中间位置:计算中间元素的索引位置。
  3. 比较中间元素:将目标值与中间元素进行比较。
  4. 缩小搜索范围:
    (1)如果目标值等于中间元素,则找到目标值,结束搜索。

(2)如果目标值小于中间元素,说明目标值可能存在于左半部分,缩小搜索范围为左半部分。

(3)如果目标值大于中间元素,说明目标值可能存在于右半部分,缩小搜索范围为右半部分。
5. 重复以上步骤:在新的搜索范围内重复执行步骤2至步骤4,直到找到目标值或确定目标值不存在为止。

二分查找的时间复杂度为 O(log n),其中n是数组的大小。由于它每次都将搜索范围减半,因此效率非常高,特别适用于有序数组的查找操作。

//    基本的二分查找 适用于有序 无重复元素的数据
//    左闭右闭型
    public static void main(String[] args) {
        int a[]= {1,3,5,7,9,11,23,45,66};
        System.out.println("1111");
        int b = binarrySearch(11,a);
        System.out.println(b);
    }
    public static int binarrySearch(int target,int[] a){
        int i = 0, j = a.length-1;
        while(i<=j){
            int mid = (i+j) >>> 1;
            if(target < a[mid]){
                j = mid - 1;
            }else if(target > a[mid]){
                i = mid + 1;
            }else{
                return mid;
            }
        }
        return -1;
    }
//    左闭右开型
    public static void main(String[] args) {
        int[] b = {1,2,3,4,5,6,7};
        int i = binarrySearch(5, b);
        System.out.println(i);
    }
    public static int binarrySearch(int target,int[] a){
        int i = 0, j = a.length;
        while(i < j){
            int mid = (i+j) >>> 1;
            if(target < a[mid]){
                j = mid ;
            }else if(target > a[mid]){
                i = mid + 1;
            }else {
                return mid;
            }
        }
        return -1;
    }
    /*
    * 二分查找平衡板  解决不平衡问题
    * if(target < a[mid])
    * else(target > a[mid])
    * 若target 在最左边 if 里面需比较l次
    *          那么在最右边 if 就要里面比较2l次
     * */
     public static int binarrySearch(int target,int[] a){
        int i = 0,j = a.length;
        while(1<j-i){
            int mid = (i+j) >>> 1;
            if(target < a[mid]){
                j = mid;
            }else{
                i = mid;
            }
        }
        if(a[i] == target){
            return i;
        }else{
            return -1;
        }
    }
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值