1.二分查找基础版
public class BinarySearch {
public static void main(String[] args){
int[] a = {1,2,4,5,67,78,89,100};
System.out.println(binarySearchBasic(a,67));
}
public static int binarySearchBasic(int a[],int target){
int i = 0, j = a.length-1; // 设置开始指针和结束指针
while(i <= j){
int m = (i+j) / 2;
if(target < a[m]){ //说明目标在m的左边,就要移动右指针
j = m - 1;
}else if(target > a[m]){ //说明目标在m的右边,移动右指针
i = m + 1;
}else{ //找到了
return m;
}
}
return -1;
}
}
关键点
1.循环结束的条件应该是
i > j而不是i >= j, 因为i = j的时候应该还要比较一下。2.
(i+j)/ 2其实是有问题的,如果i和j很大的话可能会导致溢出,可以用无符号右移int m = (i + j) >>> 1;或者使用数学方法int m = i + (j - i) / 2;
2.二分查找改动版
public class BinarySearch {
public static void main(String[] args){
int[] a = {1,2,4,5,67,78,89,100};
System.out.println(binarySearchBasic(a,67));
}
public static int binarySearchBasic(int a[],int target){
int i = 0, j = a.length; // 改动1,此时j是不可能指向要查找的元素
while(i < j){ // 改动2,循环条件变了,如果是等号的话,数组没有target会死循环
int m = (i+j) >>> 1; // 改动3,防止溢出
if(target < a[m]){
j = m; // 改动4,因为j不能指向查找的元素,所以j不能等于m-1,因为m-1对应的元素可能是target
}else if(target > a[m]){ //说明目标在m的右边,移动右指针
i = m + 1;
}else{ //找到了
return m;
}
}
return -1;
}
}