二分法查找数组元素(java代码)

二分法查找数组元素

要求:数组元素必须有序,从大到小排列,或从小到大按一定的规律进行排列。
在这里插入图片描述
利用二分法进行查找。
分析:

这个数组是从小到大进行排列的。数组长度是7,因此所引致的范围是【0,6】。首先将目标与索引值为3的元素进行比较,这里假设aim=20;a[3]=75>aim,按照数组的排列顺序,可以知道,aim应该在索引3的右侧,并且,索引为3的元素并不是我们要找的aim,因此,我们将范围改为【3+1,6】,此时,中间索引为5,然后再将索引为5的元素与aim比较,a[5]=3<aim=20,同样的,根据从小到大的排列顺序,我们要找的aim应该再索引为5的左侧,不包含5,因此范围继续减半。变为【4,5】,中间索引为4,a[4]=22=aim,返回结果。

规律&总结:首先要明确数组的排列顺序(从小到大或从大到小);其次,确定数组的界域,然后根据这个界域,得到中间索引值,将其与目标进行比较:这里要分情况进行讨论,在数组排列顺序确定的条件下,如果中间值大于目标,则重新确定一个界域,同理,中间值小于目标,也要重新确定一个界域。
循环条件的确定:上下界,a<=b(a是可能等于b的,并且当a等于b时,有可能会找到目标对象。
界域的确定:需要有两个条件确定的

  • 首先是数组的排列顺序
  • 其次是中间索引值与目标的比较结果

在这里插入图片描述

代码:

public class Find {

  public static int find(int[] array, int aim) {
    //初始化边界
    int a = 0,b = array.length-1;
    //中间索引
    int center = (a+b)/2;
    int centerValue;
    while(a<=b){
      centerValue = array[center];
      if(centerValue<aim){
        //区间应该在center左边
        b = center-1;
        
      }
      else if(centerValue>aim){
        //right
        a = center+1;
        
      }
      else if(aim==centerValue){
        return center;
      }
      center = (a+b)/2;
    }
    return -1;
  }

  public static void main(String[] args) {
    int[] array = {100, 90, 80, 75, 22, 3, 2};
    int result1 = find(array, 22);
    if (result1 == -1) {
      System.out.println("22 不存在数组中");
    } else {
      System.out.println("22 存在数组中,索引值是 " + result1);
    }

    int result2 = find(array, 50);
    if (result2 == -1) {
      System.out.println("50 不存在数组中");
    } else {
      System.out.println("50 存在数组中,索引值是 " + result2);
    }
  }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

songyitian4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值