<?php
/**
* target要查找的值
* 左、右指示符 left,right用来维持查找空间的指标
* 中间指示符 mid 用来应用条件来确定我们应该向左查找还是向右查找的索引
* from leetcode
*/
function binSearch($arr, $target){
$left = 0;
// 数组下标由0开始长度减一
$right = count($arr) - 1;
while ($left<=$right) {
$mid = intval(($left+$right)/2);
if ($arr[$mid] == $target) {
return $mid;
} elseif ($arr[$mid] > $target) {
// 中间值左边移动,查找左边边部分
$right = $mid-1;
} elseif ($arr[$mid] < $target) {
// 中间值右边边移动,查找右边边部分
$left = $mid+1;
}
}
return -1;
}
$arr = [3,6,9,23,90,180,458];
// 递归的写法
function binSearch1($arr, $target, $left, $right){
// 左边比右边的大则退出
if ($left>$right) {
return -1;
}
$mid = intval(($left+$right)/2);
if ($arr[$mid] == $target) {
return $mid;
} elseif ($arr[$mid] > $target) {
// 中间值左边移动,查找左边边部分
return binSearch1($arr, $target, $left, $mid-1);
} elseif ($arr[$mid] < $target) {
// 中间值右边边移动,查找右边边部分
return binSearch1($arr, $target, $mid+1, $right) ;
}
}
var_dump(binSearch($arr, 180));