php二分查找

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

  

posted @ 2020-09-26 16:21  brave_jman  阅读(108)  评论(0编辑  收藏  举报