使用循环实现二分查找
public int search(int[] nums, int target) {
if(nums == null || nums.length==0){
return 0;
}
int left = 0;
int right = nums.length-1;
while(left <= right){
int mid = left + ((right - left)>>1);
if(target < nums[mid]){
right = mid -1;
}else if(target > nums[mid]){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
注意:
对于mid的求解,初学者会写为 mid=(left+right)/2 ,但是除法在计算机上运行较慢,所以我们可以用 右移一位 表示除2,即 mid=(left+right)>>1 ,但是如果left和right过大可能会导致相加后溢出,所以我们改为 mid=left+((right-left))>>1 表示。
使用递归实现二分查找
public int binarySearch(int[] array, int low, int high, int target) {
while (low <= high){
int mid = low + ((high-low)>>1);
if (array[mid] == target){
return mid;
}else if(array[mid] > target){
return binarySearch2(array,low,mid-1,target);
}else{
return binarySearch2(array,mid+1,high,target);
}
}
return -1;
}