二分算法是一种高效的搜索算法,适用于有序数组,通过分治策略逐步缩小搜索范围。其核心思想是:
以升序数组为例,查找目标值 target:
low(起始位置)和 high(结束位置)。
low = 0,high = 数组长度 - 1。low <= high 时继续循环。mid = (low + high) / 2(或 mid = low + (high - low) / 2 避免溢出)。arr[mid] == target:返回索引 mid。arr[mid] > target:目标在左侧,更新 high = mid - 1。arr[mid] < target:目标在右侧,更新 low = mid + 1。low > high,说明未找到目标值,返回 -1。O(log n),其中 n 为数组长度。
O(n)。O(1)(原地查找,无需额外空间)。lower_bound/upper_bound)。public static int binarySearch(int[] arr, int target) {
int low = 0, high = arr.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2; // 防溢出
if (arr[mid] == target) return mid;
else if (arr[mid] > target) high = mid - 1;
else low = mid + 1;
}
return -1;
}
public static int lowerBound(int[] arr, int target) {
int low = 0, high = arr.length - 1;
while (low < high) {
int mid = low + (high - low) / 2;
if (arr[mid] >= target) high = mid;
else low = mid + 1;
}
return low;
}
low/high 更新方式匹配。例如:
while (low < high),则需确保每次循环都能缩小范围。mid = low + (high - low) / 2 避免整数溢出(尤其在大型数组中)。low/high 的更新逻辑(是否包含 mid),防止漏掉可能解。假设数组为 [1, 5, 10, 19, 21, 28, 30, 31, 78, 92],查找 28:
low=0, high=9 → mid=4, arr[4]=21 < 28 → 更新 low=5。low=5, high=9 → mid=7, arr[7]=31 > 28 → 更新 high=6。low=5, high=6 → mid=5, arr[5]=28 == 28 → 返回索引 5。O(n log n))。二分算法是高效查找的核心工具,但需注意实现细节(如边界处理、死循环)。掌握其思想及常见变体(如左/右边界查找),可快速解决大量实际问题。