二分查找算法详解及注意事项

前言

面试常问:给你一个排好序的数组,请你设计一种高效的算法,找出给定的目标值,如果找到返回目标值,找不到返回-1,怎么麽实现?

答:二分查找
为什么?见下文!


一、二分查找(折半查找)是什么?

  • 假设数组中的元素是按升序排列。
  • 将数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两段,如果中间位置记录的关键字大于查找关键字,则查找前一段数组,否则 查找后一段数组。
  • 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

(看不懂的看下边解释)

二、算法要求

1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。

三、算法实现

1.核心代码(重点)

首先初始化 low指针和high指针 不理解指针的可以把指针看作数组的下标值
low = 0 ; high = 数组长度-1; mid = (low+high)/2

每次都将目标值与mid指针所指的值 进行比较
如果目标值key>mid 说明目标值在比mid指针所指值大的一头 移动 low指针 即:low = mid + 1; 并且计算mid指针新的位置 即:mid = (low+high)/2;
如果目标值key<mid 说明目标值在比mid指针所指值小的一头 移动 high指针 即:high = mid - 1;并且计算mid指针新的位置 即:mid = (low+high)/2;

直到mid所指的值与目标值相同(找到了)或者 low指针大于等于high时(没找到目标值)结束查找

代码如下(示例):

 public static int search(int []arr,int key){
     int low = 0;
     int high = arr.length-1;
     while (low<=high){
         int mid = (low+high)/2;
         if (key>arr[mid]){
             low = mid + 1;
         }else if (key<arr[mid]){
             high = mid - 1;
         }else {
             return key;
         }
     }
     return -1;
 }

2.测试代码

代码如下(示例):

 /*
    二分查找
 */
 @Test
 public void test(){
     int[] arr = {1, 5, 6, 7, 16, 25, 29, 30};
     Scanner scanner = new Scanner(System.in);
     System.out.println("请输入一个数:");
     int key = scanner.nextInt();
     int res = search(arr, key);
     if (res==-1){
         System.out.println("没查到目标值");
     }else {
         System.out.println("查找到了目标值");
     }
 }

该处使用的url网络请求的数据。

3.结果

请输入一个数:5
查找到了目标值

四、图解

我的二分查找
转载请注明出处!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值