首页 > 其他 > 详细

二分查找法

时间:2021-05-04 23:21:24      阅读:19      评论:0      收藏:0      [点我收藏+]

二分查找法

基本介绍

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

实现步骤(查找单个值)

  1. 创建两个变量,low指向待查找数组的第一个位置,heigh指向待查找数组的最后一个位置

  2. 循环实现,求出数组最中间的值与待查找值下那个比较

  3. 若中间值小于待查找值,说明待查找值在中间值的左边,将low取mid+1继续进入循环查找

  4. 若中间值大于待查找值,说明待查找值在中间值的右边,将heigh取mid-1继续进入循环查找

  5. 若中间值等于待查找值,说明待查找值找到,直接返回其对应的下标即可。

  6. 终止查询条件1:若low<=heigh证明数组还未遍历完毕,继续进入循环查找,执行(2-5)步骤

  7. 终止查询条件2:循环完成还未找到待查找值,说明数组中不存在此值,返回-1;

    注:二分查找的前提条件,数组有序。

代码实现

循环实现(查找数组中出现的单个目标值):

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

递归实现(查找数组中重复出现的多个目标值):

public static Set<Integer> search(int[] arr, int key, int left, int right, Set<Integer> list){
    int l=left;
    int r=right;
    int mid=(l+r)/2;
    if(l<=r || arr[l]>key || arr[r]<key){//结束递归的条件:1,左边索引大于右边索引,2,要查找的值大于数组最大的值,或小于数组最小的值
        if(key<arr[mid]){
            search(arr,key,left,mid-1,list);
        }else if(key>arr[mid]){
            search(arr,key,mid+1,right,list);
        }else {
            list.add(mid);
            search(arr,key,left,mid-1,list);
            search(arr,key,mid+1,right,list);
        }
    }
    return list;
}

二分查找法

原文:https://www.cnblogs.com/ekig/p/14726302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!