二分查找
目录
一、题型解释
二分查找是一种在 有序数组 中快速查找目标值的高效算法。常见题型:
-
基础查找:在有序数组中判断目标值是否存在。
-
边界查找:
-
查找目标值的 第一个出现位置(左边界)。
-
查找目标值的 最后一个出现位置(右边界)。
-
-
旋转数组查找:在部分有序的旋转数组中查找目标值。
-
峰值查找:在无序数组中找到任意一个峰值元素(比相邻元素大)。
二、例题问题描述
例题1:输入有序数组 [1, 3, 5, 7, 9]
和目标值 5
,输出 true
(存在)。
例题2:输入数组 [1, 2, 2, 2, 3]
和目标值 2
,输出左边界 1
和右边界 3
。
例题3:输入旋转数组 [4, 5, 6, 7, 0, 1, 2]
和目标值 0
,输出位置 4
。
例题4:输入数组 [1, 3, 5, 4, 2]
,输出任意一个峰值元素的索引(如 2
或 3
)。
三、C语言实现
解法1:基础二分查找(难度★)
通俗解释:
-
像猜数字游戏,每次猜中间数,缩小一半范围。
c
#include <stdio.h>
int binarySearch(int arr[], int n, int target) {
int left = 0, right = n - 1; // 初始化搜索范围:整个数组
while (left <= right) { // 当范围有效时继续搜索
int mid = left + (right - left) / 2; // 防止整数溢出
if (arr[mid] == target) { // 找到目标值
return mid;
} else if (arr[mid] < target) { // 目标值在右半部分
left = mid + 1; // 缩小左边界
} else { // 目标值在左半部分
right = mid - 1; // 缩小右边界
}
}
return -1; // 未找到
}
int main() {
int arr[] = {1, 3, 5, 7, 9};
int target = 5;
int index = binarySearch(arr, 5, target);
printf("目标值位置:%d", index); // 输出 2
return 0;
}
代码逻辑:
-
初始化范围: