该算法有很多版本,这里给出java中实现比较好的一种方式。其中,>>>
为无符号右移。
二分查找第一个值为obj的元素
/**
* 二分查找第一个值为obj的元素
* @param array
* @param obj
* @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
*/
public static int binarySearchFirstEqual (int[] array, int obj) {
if (array == null || array.length == 0) {
return -1;
}
int left = 0;
int right = array.length - 1;
while (left < right) {
int mid = left + ((right - left) >>> 1);
if (array[mid] < obj) {
left = mid + 1;
} else {
right = mid;
}
}
if (array[left] == obj) {
return left;
}
return -(left + 1); // 参照官方文档自定义值
}
二分查找最后一个值为obj的元素
/**
* 二分查找最后一个值为obj的元素
* @param array
* @param obj
* @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
*/
public static int binarySearchLastEqual (int[] array, int obj) {
if (array == null || array.length == 0) {
return -1;
}
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = left + ((right - left) >>> 1);
if (array[mid] <= obj) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (right >= 0 && array[right] == obj) {
return right;
}
return -(right + 1); // 参照官方文档自定义值
}