问题描述: 请对一个有序(在这讲的是升序)的数组{1,4,9,11,33,41,69,72,99}进行二分查找,输入一个数看看该数组是否存在该数,并且求出下标,如果没有就返回提示没有这个数
二分查找思路分析:(对一个有序的数组进行查找)
1.首先确定该数组的中间下标(在这用mid来表示) mid = (left + right)/2
2.然后让需要查找的数(findVal)与arr[mid]做比较:
1)findVal > arr[mid],说明要查找的数在mid的右边,因此需要递归向右查找
2)findVal < arr[mid],说明要查找的数在mid的左边,因此需要递归向左查找
3)findVal == arr[mid],说明找到,返回
什么时候应该结束递归:
1)找到就结束递归
2)递归完整个数组,仍然没有找到findVal,也需要结束递归(即当left > right)
有人看到这里可能就要疑问了?诶,凭什么left > right,就结束递归了?你说结束就结束是么?别急,看完下面你就明白了(实在不明白的话,可以自己选一个小一点的数组,自己推一遍,我一开始也是一头雾水,后面自己推了一遍过程就很清晰了)
left > right(边界条件): 由题意,在这讲的是升序(降序相反),我们可以知道当寻找一个数时,总要要移动 left 或 right 的下标。
例如: 向左递归时,我们left不变,right等于mid-1(相当于向左移动) 向右递归时,我们right不变,left等于mid+1(相当于向右移动)
只要数组不是无限大的,那么 left 一直向右移动,right 一直向左移动,总有一次当 left > right 时代表所有数都已经找完了,没有找到,这时候就应该停止递归,返回-1,提示我们没有找到这个值了
public class BinarySearch {
public static void main(String[] args) {
int[] arr = new int[]{1,4,9,11,33,41,69,72,99};
int index = binarySearch(arr,0,arr.length-1,99);
System.out.printf("index:"+index);
}
public static int binarySearch(int[] arr,int left,int right,int findVal) {
if (left > right) return -1;//未找到用-1表示
int mid = (right + left) / 2;
int midVal = arr[mid];
//找到就返回下标
if(findVal > midVal){//要查找的数在mid的右边,向右递归
return binarySearch(arr,mid +1 ,right,findVal);
}else if (findVal < midVal){//要查找的数在mid的左边,向左递归
return binarySearch(arr,left,mid -1,findVal);
}else {//findVal == arr[mid]
return mid;
}
}
}
>>index:8