二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
创建两个变量,low指向待查找数组的第一个位置,heigh指向待查找数组的最后一个位置
循环实现,求出数组最中间的值与待查找值下那个比较
若中间值小于待查找值,说明待查找值在中间值的左边,将low取mid+1继续进入循环查找
若中间值大于待查找值,说明待查找值在中间值的右边,将heigh取mid-1继续进入循环查找
若中间值等于待查找值,说明待查找值找到,直接返回其对应的下标即可。
终止查询条件1:若low<=heigh证明数组还未遍历完毕,继续进入循环查找,执行(2-5)步骤
终止查询条件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