概述
这里我用 Java 语言实现了二分查找算法,虽然该算法的思维非常容易理解,但是在细节之处,比如在查找的边界上有很多值得注意的地方,这里不容小视。
二分查找
如下是代码所示,请大家注意边界的处理,具体解释的话可以参考这个链接 – 二分查找的几种写法。
public class BinarySearch {
// 二分查找,左闭右开
public int binSearch(int[] arr, int target) {
int start = 0, end = arr.length;
while (start < end) {
int mid = start + (end - start) / 2; // 防止整数相加溢出
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
start = mid + 1;
else if (arr[mid] > target)
end = mid; // 左闭右开,end 取不到
}
return -1;
}
// 二分查找,左右都闭的写法
public int binSearchAnotherWay(int[] arr, int target) {
int start = 0, end = arr.length - 1;
while (start <= end) {
// 是否取等号,关键看 end 是否可以取到
int mid = start + (end - start) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
start = mid + 1;
else if (arr[mid] > target)
end = mid - 1; // 此时 end 可以取到,mid 已经判断过,所以要 mid-1
}
return -1;
}
// 二分查找,寻找最开始等于目标值的位置,左闭右开
public int binSearchFindStart(int[] arr, int target) {
int start = 0, end = arr.length;
while (start < end) {
int mid = start + (end - start) / 2;
if (arr[mid] < target)
start = mid + 1;
else if (arr[mid] >= target)
end = mid; // 找到目标值后继续往左缩小范围
}
if (start == arr.length) // 找到最右边都没有找到
return -1;
return arr[start] == target ? start : -1;
}
// 二分查找,寻找最开始等于目标值的位置,左闭右闭
public int binSearchFindStartAnotherWay(int[] arr, int target) {
int start = 0, end = arr.length