key是13,如下图:
middle=(0+6)/2=3;
下标为3的值是15>key,所以要将middle向前移动一位作为新的high,因为是有序数组,后面的元素就无需再考虑了,如果中间值比key小,将middle向后移一位做新的low,如果low>high了则说明该数组没有值为k的。(向右为后)
public static void main(String[] args) {
int arr[]={12,13,14,15,16,17,19};
// int key=13;
// int index=binary_search(arr,key);
// System.out.println(index);
int index2=binary_search2(arr,15,0,arr.length-1);
System.out.println(index2);
}
public static int binary_search(int arr[], int key){ //非递归方法
int low=0;
int high=arr.length-1;
int middle=0;
if(key<arr[low]||key>arr[high]||low>high){
return -1;
}
while(low<=high){
middle=(low+high)/2;
if(arr[middle]>key){
high=middle-1;
}else if(arr[middle]<key){
low=middle+1;
}else {
return middle;
}
}
return -1;
}
public static int binary_search2(int arr[],int key,int low,int high){ //递归方法
//不要在这里将low和high初始,否则会出现栈溢出的错误,因为每调用一次这个方法,low和high的值又是下面两个,没有进行更改,可能会造成死循环
// low=0;
// high=arr.length-1;
if(key<arr[low]||key>arr[high]||low>high){
return -1;
}
int mid=(low+high)/2;
if(arr[mid]>key){
return binary_search2(arr,key,low,mid-1);
}else if(arr[mid]<key){
return binary_search2(arr,key,mid+1,high);
}else {
return mid;
}
}