二分查找法(容易被忽略的错误)

本文详细介绍了二分查找算法的实现细节及其注意事项,包括数组存储、有序排列的要求,以及实现过程中的四个关键点:边界条件处理、中间索引计算优化、避免死循环的方法和返回插入点的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

使用二分查找,必须要满足:

存储在数组中(不可以是链表)、有序排列

public class BinarySearch{

    public static int BinarySearch(int []  list , int key ){

        int low = 0,high = list.length -1;

        while( low <= high ){        // 1

            int mid = low + ((hight - low) / 2) ;   //2

            if(key<list[mid])

                high = mid - 1;       //3

            else if(key==list[mid])

                return mid;

            else

                low = mid + 1;

        }

        return  -1;            //4    }

}low <= high ){        // 1

            int mid = low + ((hight - low) / 2) ;   //2

            if(key<list[mid])

                high = mid - 1;       //3

            else if(key==list[mid])

                return mid;

            else

                low = mid + 1;

        }

        return  -1;            //4    }

}

要值得留意的4点:

 

1、如果low<=high 换成low<high,则查找可能会漏掉匹配元素,如当数组只有一个元素的时候。

2、这应该是一个优化措施吧,采用(low+high)/2存在溢出的风险,我们知道int是16位,最大的值为65535,假设你定义的数组是60000,low和high分别为30000,40000,两者相加就会溢出,变成一个负数,而采用上面的代码,则不会发生这样的错误。其实我们在很多时候都应该留意一下溢出问题,毕竟计算机里的加减乘除是收到限制的。 

3、最近做的一道题目说如果把high = mid - 1换成high = mid可不可以,答案是不可以: 
考虑数组{2,4,6,8}如果查找一个不再数组中的值1,则会出现死循环。

4、这也应该是一个优化措施,当没有找到要查找的关键字时,-(-low-1)就是一个插入点,这个位置插入关键字可以保持序列的有序性。 
解释:首先明确一下,一定要返回一个负值,表示关键值不在序列里面。 
但可不可以返回-low? 
答:不可以,如果关键字小于low[0],那么-0也是0,这表明关键字与list[0]匹配。 
所以一个好的选择是返回-low-1,不仅说明了关键字不在序列,也指出了它应该插在哪个位置。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值