二分查找算法

一、二分查找原理

二分查找针对有序的数组,利用数组下标,通过和区间元素的中间值比较,将待查找的元素区间缩减为原先的一半,直到找到元素,或区间元素个数缩减为0。

优点:查找时间效率高:logN
缺点
1、仅适用于顺序表结构,简单点说就是数组,如链表不适合二分查找,因为二分算法是基于下标随机访问,数组的时间复杂度为O(1),链表为O(n),会增加时间复杂度
2、仅适合数据有序的情况。
3、数据量太大也不适合二分查找,因此核心依赖于数组,而数组要求存储为连续的空间,因此数据量太大时,连读的内存空间资源要求较高。

示例:在0-50中,查找元素22
在这里插入图片描述

二、java示例代码

//二分查找
public class BsearchTest {
    //区间不存在对应元素,返回为-1,否则返回对应数组下标
    public int bSearch(int[] arraySource,int value){
        int len = arraySource.length;
        int low =0;
        int high = len-1;
        //若查找的元素不在区间范围内,直接返回-1
        if(arraySource[0]>value || arraySource[high]<value){
            return -1;
        }
        while(low<=high){
            int mid = low+((high -low)>>1);  //注意点:low和high下标较大,若采用 (low+high)/2,导致溢出
            if(arraySource[mid] == value){
                return mid;
            }else if(arraySource[mid]>value){
                high = mid -1;
            }else{
                low = mid +1;
            }
        }
        return -1;     //若区间不存在对应元素,返回为-1
    }

    public static void main(String args[]){
        int[] arraySource = new int[51];
        for(int i =0;i<=50;i++){
            arraySource[i] = i;
        }
        int target = 22;
        BsearchTest bTest = new BsearchTest();
        int index = bTest.bSearch(arraySource,target);
        System.out.println("下标为:"+index);
        target = 56;
        index = bTest.bSearch(arraySource,target);
        System.out.println("下标为:"+index);
    }
}

注意事项
1、注意中间取值,mid=(low+high)/2,如果 low 和 high 比较大的话,两者之和就有可能会溢出,因此需调整为:low+(high-low)/2的方式,最优是采用位移方式除2 :low+((high -low)>>1)

2、循环退出条件:low<=high

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值