二分查找算法是在排序数组中查找特定值的有效方法。 这种方法将数组分成更小的部分,并不断将搜索范围中间位置的值与目标值进行比较。 如果值匹配,则找到所需的值; 否则,算法继续缩小搜索范围并重复该过程,直到找到该值或没有更多元素可供检查。
脚步:
- 初始化搜索范围: 首先选择从 数组的第一个位置
left
到最后一个位置的搜索范围。right
- 求中点:
left
通过对左右位置 求平均来计算中点; 这是搜索范围的中间点。 - 比较值: 将中间点的值与目标值进行比较。
- 处理比较结果: 如果中间点的值与目标值匹配,则返回该位置。 如果中间点的值小于目标值,则将左侧位置更新为middle + 1以搜索右半部分。 如果中间点的值大于目标值,则将右侧位置更新为 middle- 1 以搜索左半部分。
- 重复: 重复步骤2到4,直到找到该值或没有更多元素可供检查
left > right
。
的优点和缺点
优点:
- 高效的性能: 该算法的时间复杂度为O(log n),对于处理大型数据集非常高效。
- 对大型数据集有效: 二分搜索可有效减少大型数据集快速检查的元素数量。
缺点:
- 仅适用于排序数组: 该算法仅适用于排序数组。
- 可变步数: 查找值所需的步数取决于其在数组中的位置,对于靠近末尾的值可能需要很多步。
示例:在 PHP 中的排序数组中查找值 12 的二分查找
function binarySearch($arr, $target) {
$left = 0;
$right = count($arr)- 1;
while($left <= $right) {
$mid = floor(($left + $right) / 2);
if($arr[$mid] == $target) {
return $mid; // Return the position of the value
} elseif($arr[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid- 1;
}
}
return -1; // Value not found
}
$array = [2, 5, 8, 12, 15, 20, 30];
$targetValue = 12;
$result = binarySearch($array, $targetValue);
if($result != -1) {
echo "Value $targetValue found at position $result.";
} else {
echo "Value $targetValue not found in the array.";
}
示例说明
- 我们从数组的第一个位置
left = 0
到最后一个位置的 初始搜索范围开始。right = 6
- 我们通过左右位置的平均来计算中间点(mid);
mid = 3
。 中间的值为 12。 - 我们将) 处的值
mid(12
与目标值(12) 进行比较并找到匹配项,因此我们返回位置 3。 - 算法结束,我们输出结果“在位置 3 找到值 12”。