二分查找
代码实现(基础版)
// 左闭右闭
public static int BinarySraechBasic(int[] arr, int target){
int left = 0 ; int right = arr.length-1;
while(left <= right){
// 如果出现比较大的left和right的时候 两个加和就可能超过int最大值
// int middle = (left+right)/2;
int middle = (left+right) >>> 2;
if(target < arr[middle]){
right = middle-1;
}
else if(arr[middle] < target){
left = middle+1;
}
else{
return middle;
}
}
return -1;
}
注意事项
问题一:如果写成i < j 的话就会出现最后一个i = j 的元素没有被判断是否为target
问题二:如果left和right加和超过int最大值的话 最后返回一个负数哦 所以要用右移运算符
问题三:更加方便看到大小关系哦
改动版(right作为一个边界而已)
// 更常用
// 左闭右开
public static int BinarySraech(int[] arr, int target){
int left = 0 ; int right = arr.length;
while(left < right){
// 如果出现比较大的left和right的时候 两个加和就可能超过int最大值
// int middle = (left+right)/2;
int middle = (left+right) >>> 2;
if(target < arr[middle]){
right = middle;
}
else if(arr[middle] < target){
left = middle+1;
}
else{
return middle;
}
}
return -1;
}