核心思想:对于一个有序数组,如果目标值小于中间值,则目标值在数组的左半边;反之,则在右半边;或者,目标值正好是中间值。通过不断缩小查找范围,从而找出目标值的索引。
递归方法代码实现
public class BinarySearch {
private static int binarySearch(int[] arr,int left,int right,int findVal){
if(left>right){
return -1;
}
int mid=(left+right)/2;
if(findVal>arr[mid]){
return binarySearch(arr,mid+1,right,findVal);
}else if(findVal<arr[mid]){
return binarySearch(arr,left,mid-1,findVal);
}else{
return mid;
}
}
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5,6,7,8,9};
int target=binarySearch(arr,0,9,3);
System.out.println(target);
}
}
迭代方式代码实现
public class BinarySearch02 {
private static int binarySearch02(int[] arr,int target){
int n=arr.length;
if(n==0) return -1;
if(n==1) return target==arr[0]?0:-1;
int left=0,right=n-1;
while(left<=right){
int mid=(left+right)/2;
if(target==arr[mid]){
return mid;
}
if(target<arr[mid]){
right=mid;
}else{
left=mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5,6,7,8,9};
int res=binarySearch02(arr,4);
System.out.println(res);
}
}