二分查找法

二分查找法

基本介绍

二分查找也称折半查找(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;
}

posted on 2021-05-04 21:56  凡人精灵  阅读(232)  评论(0)    收藏  举报

导航