一、最简单的二分查找
最原始的二分查找,直接上代码
[1]递归二分查找
public int binarySearch(int[] nums , int key , int left ,int right){
if (left>right){
return -1;
}
int mid=(left+right)/2;
if (nums[mid]==key){
return mid;
}else if (key<nums[mid]){
return binarySearch(nums,key,left,mid-1);
}else {
return binarySearch(nums,key,mid+1,right);
}
}
[2]非递归二分查找
public static int binarySearch(int[] nums , int key){
int low=0;
int high=nums.length-1;
int mid=(low+high)/2;
while (low<=high){
if (key<nums[mid]){
high=mid-1;
}else if (key>nums[mid]){
low=mid+1;
}else {
return mid;
}
mid=(low+high)/2;
}
return -1;
}
二、找到最接近的值的下标
public static int binarySearchOrClosest(int[] nums,int key){
int low=0;
int high=nums.length-1;
int mid=(low+high)/2;
while (mid!=low && mid!=high){
if (nums[mid]<key){
low=mid;
mid=(low+high)/2;
}else if (nums[mid]>key){
high=mid;
mid=(low+high)/2;
}else {
return mid;
}
}
return (Math.abs(nums[low]-key))<(Math.abs(nums[high]-key))? low :high;
}
如果需要返回最接近的且比key小或者大的值得下标,增加以下失败条件的判断和返回值即可。例如,返回最接近key且<=key的值得下标:
public int binarySearchTheMin(int[] nums , int key){
int low=0;
int len=nums.length;
int high=len-1;
int mid=(low+high)/2;
if (key<nums[0]){
return -1;
}else if (key>nums[len-1]){
return len-1;
}
while (mid!=low && mid!=high){
if (nums[mid]<key){
low=mid;
mid=(low+high)/2;
}else if (nums[mid]>key){
high=mid;
mid=(low+high)/2;
}else {
return mid;
}
}
return low;
}