今天看JAVA视频,无意中看到了二分查找,然后在PHP中试了下。一样可行。

思路:

  • 我们有一个数组,首先我们需要找到数组的中间位置.
  • 要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值来和我们的值做对比。
  • 如果中间值大于我们的给定值,说明我们的值在中间位置之前,此时需要再次二分,因为在中间之前,所以我们需要变的值是结束位置的值,此时结束位置的值应该是我们此时的中间位置。
  • 反之,如果中间值小于我们给定的值,那么说明给定值在中间位置之后,此时需要再次将后一部分的值进行二分,因为在中间值之后,所以我们需要改变的值是开始位置的值,此时开始位置的值应该是我们此时的中间位置,直到我们找到指定值。
  • 或者中间值等于最初的起始位置,或结束位置(此时说明给定值未找到),下面我们来用代码实现~
    注意项:
  • 算法只是一种思路,并不做案例
  • 二分查找,需要在一定要在有序数组上进行
  • 重复值,并不能完全指定值,只是取其它的一个值,

function test()
{
    $num = 9;
    $Arr = [1, 2, 5, 9, 20, 85, 90, 91, 93, 95, 96, 97, 98, 99, 100, 101];
    var_dump($this->binarySearch($num, $Arr));
    // return false;
}
/*
[binarySearch 二分算法]
@Author   Jerry
@DateTime 2018-04-17T10:56:01+0800
@Example  eg:
@return   [type]                   [description]
 */
function binarySearch($num, $Arr)
{
    $low    = 0; ##开始下标
    $height = count($Arr) - 1; ##最大下标
    $middle = floor(($low + $height) / 2); ##中间值
    while ($low <= $height) {
        if ($Arr[$middle] == $num) {
            ##刚好取中
            return $middle;
        } elseif ($Arr[$middle] <= $num) {
            ##如果取的值小于当前数 那么意味着该值在数组的后半段 所以起始位置变成当前的middle+1的值,end位置不变。
            $low    = $middle + 1; ##不等于,向后取一位
            $middle = floor(($low + $height) / 2);
        } else {
            //取左边的值,也就是前半段
            $height = $middle - 1; ##不等于,向前取一位
            $middle = floor(($low + $height) / 2);
        }
    }
    return false; ##没有此值

}