java 二分查找

二分查找又称折半查找,是一种较高效率的查找方法。

优点:比较次数少,查找速度快,平均性能好,占用系统内存较少。

缺点:要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

算法要求:

1.必须采用顺序存储结构。

2.必须按关键字大小有序排列。

算法思想:
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x小于a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x大于a[n/2],则我们只要在数组a的右 半部继续搜索x

算法实现

方式一:while循环

public int binarySearch(Integer[] srcArray, int element) {
        //定义初始最大、最小索引
        int start = 0;
        int end = srcArray.length - 1;
        //确保不会越界重复查找
        while (start <= end && start <= srcArray.length - 1 && end <= srcArray.length - 1) {
            //获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,
            // 这样产生溢出后再 / 2 是不会产生正确结果的,
            int middle = start + (end - start) / 2;
            if (element == srcArray[middle]) {
                return middle;
                //判断下限
            } else if (element < srcArray[middle]) {
                end = middle - 1;
                //判断上限
            } else {
                start = middle + 1;
            }
        }
        //若没有查找到则返回-1
        return -1;
    }

方式二:递归

    public int binarySearch(Integer[] srcArray, int start, int end, int element) {
        //获取中间索引,若写为:middle=(start+end)/2,则会出现在当start+end的结果大于表达式结果类型所能表示的最大值时,
        // 这样产生溢出后再 / 2 是不会产生正确结果的,
        int middle = start + (end - start) / 2;
        if (element == srcArray[middle]) {
            return middle;
        } else if (start > end) {
            return -1;
            //判断下限
        } else if (element < srcArray[middle]) {
            end = middle - 1;
            return binarySearch(srcArray, start, end, element);
            //判断上限
        } else {
            start = middle + 1;
            return binarySearch(srcArray, start, end, element);
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值