概念
二分法是通过递归的方法,不断地以二分的形式,缩小比较空间,以达到快速查找某个值是在列表中哪个位置的方法
逻辑
- 根据传入的最小索引范围start和最大索引范围计算mid中间位置:
mid = (start+end+1)/2 - 判断mid索引对应的值是否等于要求的值,是则返回对应下标,否则继续比较
- 若mid索对应值大于要求的值:
则从start~mid-1中进行查找 - 否则从 mid+1~end中进行查找
- 为何是从mid-1或mid+1内进行查找?
因为我们在第二步已经判断了mid对应的索引值不是我们要的值了。所以缩小空间进行查找时,则不需要加mid这个位置带上了
代码实现
//二分法查找值的下标
public static int binarySearchIndex(int[] nums,int val,int start,int end){
if(end-start<0){
//找不到对应值,返回-1
return -1;
}
int mid = (start+end+1)/2;
if(nums[mid]==val){
//找到对应值,返回对应值下标
return mid;
}else if(nums[mid]>val){
return binarySearchIndex(nums,val,0,mid-1);
}else{
return binarySearchIndex(nums,val,mid+1,end);
}
}
思考:
能否优化二分查找法,快速获取新数值在原有序数组中的插入位置?