二分查找的基础是数组有序。
二分查找的过程: 从数组的中间开始查找,如果给定值与中间值相等,则查找成功;如果给定值小于中间值,则在左半部分查找;如果给定值大于中间值则在右边部分查。
具体看下面代码和注释
public class test {
public static int find1(int[] arr,int n){
int left = 0;
int right = arr.length; //左闭右开 [left,right)
//区间内的元素个数为right-left ==> right-left>0 ==> right > left
while(right > left){
int mid = (left+right)/2;
if(arr[mid] == n){
return mid;
}
if(arr[mid] < n){
//[mid+1,right)
left = mid+1;
}else{
right = mid; //左闭右开
}
}
return -1; //没找到
}
public static int find2(int[] arr,int n){
int left = 0;
int right = arr.length-1; //左闭右开 [left,right]
//区间内的元素个数为right-left+1 ==> right-left+1 > 0 ==> right-left > -1 ==> right-left >= 0
while(right >= left){
int mid = (right+left)/2;
if(arr[mid] == n){
return mid;
}
else if(arr[mid] < n){
left = mid+1;
}else{
right = mid-1; //左闭右闭,所以要-1
}
}
return-1; //没找到
}
public static void main(String[] args) {
int[] arr = {1,3,5,8,9,12,14};
System.out.println(find1(arr,5));
System.out.println(find2(arr,12));
}
}