二分查找是一种高效的查找算法;非递归二分查找可参考此篇博文
目录
1. 算法思想
1)选取一个mid值,并在每次递归时刷新mid值;
2)if(key<nums[mid]),则结束该次函数,使right移到mid-1,开始递归;
3)if(key>nums[mid]),则结束该次函数,使left移到mid+1,开始递归;
4)if(key==nums[mid],则找到指定的key值,return mid;
5)递归终止条件if(left>right),则表明未找到指定的key值,终结递归,返回-1;
2. 代码
public class BinarySearch{
public static int binarySearch(int nums[],int key,int left,int right) {
if(left>right) { //递归终结条件,并未找到key值
return -1;
}
int mid = (left+right)/2; //mid为中间值,并在每次递归时刷新
if(key<nums[mid]) { //key<nums[mid]则结束此函数,将right移到mid-1开始递归
return binarySearch(nums,key,left,mid-1);
}else if(key>nums[mid]) { //key>nums[mid]则结束此函数,将left移到mid+1开始递归
return binarySearch(nums,key,mid+1,right);
}else {
return mid; //key值与nums[mid]相等,返回mid
}
}
public static void main(String[] args) {
int A[]= {1,2,3,4,5,6,7,8,9,10};
System.out.println(binarySearch(A,10,0,A.length-1));
}
}
// output: 9
3. 与非递归传入参数的不同
因为在递归的时候要刷新 mid 的值(即每一次递归的mid值肯定是不一样的),所以在传入参数的时候我们加入了两个参数 left 和 right,left 初始值为数组第一个元素的下标,right 初始值为最后一个元素的下标。