public int bsearch(int[] a, int n, int value) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
变形一:查找第一个等于给定值的元素
与原题区别在于,当a[mid] == value时,还需要确认是不是第一个值等于给定值的元素。
当遍历到数组第一个数,或者左边值不同时,必定是第一个,直接返回(此处同时做了溢出校验)
当不是第一个元素时,从右到左收缩区间,继续二分查找。
/**
* 变形一:
* 存在重复元素,查找第一个等于给定值的元素
*/
public int bsearch1(int[] a, int n, int value) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
if (a[mid] > value) {
high = mid - 1;
} else if (a[mid] < value) {
low = mid + 1;
} else {
//此处区别在于,当a[mid]等于需要的值时,还需要确认是不是第一个值等于给定值的元素.当遍历到数组第一个数,或者左边值不同时,必定是第一个,直接返回
if ((mid == 0) || (a[mid - 1] != value)) {
return mid;
} else {
high = mid - 1;
}
}
}
return -1;
}