这是我自己写的二分查找(比较繁杂多余):
public class Binarysearch {
public static void main(String[] args) {
int[] arr = {3, 14, 22, 32, 45, 52, 63, 68, 79, 82};
int temp = Binarysearch(arr, 53);
System.out.println(temp);
}
public static int Binarysearch(int[] arr, int target) {
int low = 0, higth = arr.length - 1;
while (low < higth) {
int mid = (low + higth) / 2;
if (arr[low] == target) {
return low;
}
if (arr[higth] == target) {
return higth;
}
if (arr[mid] == target) {
return mid;
}
if (arr[mid] > target) {
higth = mid - 1;
}
if (arr[mid] < target) {
low = mid + 1;
}
}
return -1;
}
}
改进之后:
public class Binarysearch1 {
public static void main(String[] args) {
int[] arr = {3, 14, 22, 32, 45, 52, 63, 68, 79, 82};
int temp = Binarysearch(arr, 52);
System.out.println(temp);
}
public static int Binarysearch(int[] arr, int target) {
int low = 0, higth = arr.length - 1;
while (low <= higth) {
//关键的在这,<=的话会多一次判断,也就是会把目的值=low,higth的情况包含进去
int mid = (low + higth) >>> 1;
//>>>1 (无符号右移)表示为:将其转换为二进制数,求出补码,然后整体向右移一位 (当然这是正数的情况)
//比如(0+7)>>>1等于3
7的原码为 0000 0111,补码为其本身0000 0111,向右移一位,变成了0000 0011=3
//为什么用这个呢,因为原本的(i+J)/2,如果是大批量的数据 那计算到后面 (i=mid+1)那i+j的值会非常大
//可能会导致数据溢出(int的范围:-2的31次方-1 到 +2的31次方-1)
溢出之后的数据会变成负数
if (target < arr[mid]) {
//此处的< 与下方的< 其实这样写,更符合我们人的思维方式,一看就知道目标值在mid的左侧还是右侧
higth = mid - 1;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
}