Java 二分法查询(非递归)

本文详细介绍了二分查找法的概念、所需条件及其两种实现方式。二分查找适用于有序数组,通过比较中间元素与目标值决定查找方向。在非递归实现的示例代码中,展示了如何在数组中寻找目标值。文章强调了数组长度奇偶性对查找的影响并不关键,重点在于正确处理边界条件。

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

目录

一、二分法查找的思想

二、二分法查找需要满足的条件

三、二分法查找的两种方式


一、二分法查找的思想

二分查找法使用的基本条件是一个有序的数组,数组默认是递增的。通过从数组头部和尾部折半,判断要查找的数和mid位置数值的大小,来判断要查找的数是在哪一半,之后继续折半查找,直至找到这个数或者最后小端大于大段则结束查找!

  • 首先选择数组中间的数字和需要查找的目标值比较
  • 如果相等最好,直接就可以返回答案
  • 如果不相等 

      (1)如果中间值(mid)>  需要查找的值(target)--->向左找,中间数字向右的所有数字都大于目标值,全部排除

      (2)如果中间值(mid)<  需要查找的值(target)--->向右找,中间数字向左的所有数字都小于目标值,全部排除

二、二分法查找需要满足的条件

  • 用于查找的内容逻辑上来说是需要有序的
  • 查找的数量只能是一个,而不是多个

三、二分法查找的两种方式

因为查找的区间是不断迭代的,所以确定查找的范围十分重要,主要就是左右区间的开和闭的问题,开闭不一样,对应的迭代方式也不一样,有以下两种方式:

  • 左闭右闭 [left,right]
  • 左闭右开 [left,right)

但是千万不要一直纠结中间的数字两边的数字数量不一样这个问题,因为:

  • 两边数量不一样是一定会出现的情况
  • 但是这种情况并不影响我们对中间数字和目标数字大小关系的判断

               (1)只要中间数字大于目标数字,就排除右边的
               (2)只要中间数字小于目标数字,就排除左边的

  • 所以数组长度是偶数还是奇数这个真的不重要,不影响怎么排除的问题,无非是多排除一个数字或者少排除一个数字

           真正影响的是中间那个数字到底该不该加入下一次的查找中,也就是边界问题

代码如下:

package arithmetic;

/**
 * @desc 二分查询 (非递归方式)
 * 案例:
 * {1,3,8,10,11,67,100},编程实现二分法查找,要求使用非递归方式完成。
 * @author lf
 * @Date 2021
 */
public class BinarySearchAlgorithm {
    public static void main(String[] args){
        int[] arr = {1,3,8,10,11,67,100};
        int index = binarySearch(arr,8);
        if (index != -1){
            System.out.println("找到了,下标为:"+index);
        }else{
            System.out.println("没有找到---");
        }
    }

    private static int binarySearch(int[] arr,int target){
        int left = 0;
        int right = arr.length - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            if (arr[mid] == target){
                return mid;
            }else if(arr[mid] > target){
                //中间值(mid) > 需要查找的值(target) ---> 向左找
                right = mid - 1;
            }else{
                //中间值(mid) < 需要查找的值(target) ---> 向右找
                left = mid + 1;
            }
        }
        return -1;
    }
}

查找数组为2的下标:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值