未改进的算法:如果要查找的元素在左边就要判断L次,若在右边就要判断2L次。
public static int binarySearch(int[] a, int target){
int i = 0;
int j = a.length;
while(i<j){
int m = (i+j)>>>1;
if(target < a[m]){
j = m;
}
else if(a[m] < target){
i = m+1;
}
else{
return m;
}
}
return -1;
}
改进之后:
优点:循环内的平均比较次数减少了
缺点:为改进之前最好的情况时间复杂度为O(1)
改动之后最好和最坏的情况都是O(log(n))
public static int binarySearch(int[] a, int target){
int i = 0; //1在左闭右开的区间,i指向的可能是目标 j只作为边界
int j = a.length;
while(1 < j - i){ //2不在循环内找出,等范围内只剩i时,退出循环,在循环外比较a[i]与target
int m = (i+j) >>> 1;
if(target < a[m]){
j = m;
}
else{
i = m;
}
}
if(a[i] == target){ //3在循环外比较平均次数减少了
return i; //4时间复杂度O(log(n))
}
else{
return -1;
}
}