<?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));