二分查找算法也称折半查找,是一种非常高效的工作于有序数组的查找算法。
图1-1
给一个有n(图中为8个)个元素的有序数组A,每个元素都有对应的下标,设i=0,j=n-1,m=floor[(i+j)/2],向下取整,在图中m=3,我们规定想要查找的元素如果存在则返回对应的下标,不存在则返回-1,我们假设四种情况:
第一种:查找的元素target=30,即A[m]=target,返回3。
图1-2
第二种:查找的元素target=45,target>A[m],m左面的元素(包括m)不需要再进行比较,所以i=m+1,如图1-2所示,此时i=4,j=7,m=5,得到A[m]=target,返回坐标5。
图1-3
第三种:查找元素target=12,target<A[m],m右面的元素(包括m)不需要再进行比较,所以j=m-1,如图1-3所示,此时i=0,j=2,m=1,即target=A[m],返回下标1。
图1-4
第四种:查找元素target=48,target>A[m],m左面的元素(包括m)不需要再进行比较,所以i=m+1,,如图1-2所示,此时i=4,j=7,m=5,但是target仍然>A[m],继续进行查找,i=5,j=7,m=6,target<A[m],j=m-1,此时i=j=5,m=5,target>A[m],i=m+1=6,此时i>j,如图1-4所示,即未找到,结束,返回-1。
那么以上就是二分查找基础的四种情况了,接下来会用Java代码进行实现。
public class BinarySearch {
public static void main(String[] args) {
//定义一个数组
int[] arr={3,12,21,30,37,45,56,63};
//1.目标值刚好等于中间值
System.out.println(binarySearchBasic(arr, 30)); //3
//2.目标值大于中间值
System.out.println(binarySearchBasic(arr, 56)); //6
//3.目标值小于中间值
System.out.println(binarySearchBasic(arr, 12)); //1
//4.未找到目标值
System.out.println(binarySearchBasic(arr, 50)); //-1
}
/**
*
* @param arr 升序的数组
* @param target 要查找的元素值
* @return
*/
public static int binarySearchBasic(int[] arr,int target){
//设置指针和初始值
int i=0,j=arr.length-1;
//只要在这个范围内就有值可查
//i必须小于等于j,如果不加等于i=j会不进行查询,会漏掉一次
while (i<=j){
//确定中间索引mid
int mid=(i+j)/2;
//目标值小于中间值
if (target<arr[mid]){
j=mid-1;
//目标值大于中间值
}else if (target>arr[mid]){
i=mid+1;
}else {
//找到则返回对应的索引
return mid;
}
}
//找不到则返回-1,此时i>j
return -1;
}
}
那么,以上就是二分查找的基础版了。