PHP经典算法之二分查找

在树林里,许多的小鸟在自由自在欢乐地飞翔着,高兴起来,便唱出清脆悦耳的曲子,和煦的春风吹拂着小河,河面上波光粼粼。我忽然被一阵悦耳、动听的笛声所牵动,放眼望去,一群顽皮的小孩子正用垂柳的茎做柳笛呢!他们吹出了心里的幸福和快乐。

<?php

/**
 * 二分查找
 *
 * @author   haodaima.com
 * @date     2020/6/17
 * -------------------------------------------------------------
 * 思路分析:数组中间的值floor((low+top)/2) 
 * -------------------------------------------------------------
 * 先取数组中间的值floor((low+top)/2)然后通过与所需查找的数字进行比较,
 * 若比中间值大则将首值替换为中间位置下一个位置,继续第一步的操作;
 * 若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作
 * 重复第二步操作直至找出目标数字
 */

// +--------------------------------------------------------------------------
// | 解题方式    | 这儿,可能有用的解决方案
// +--------------------------------------------------------------------------

/**
 * 非递归版 二分查找
 *
 * @param array $container
 * @param       $search
 * @return int|string
 */
function BinaryQuery(array $container, $search)
{
    $top = count($container);
    $low = 0;
    while ($low <= $top) {
        $mid = intval(floor(($low + $top) / 2));
        if (!isset($container[$mid])) {
            return '没找着哦';
        }
        if ($container[$mid] == $search) {
            return $mid;
        }
        $container[$mid] < $search && $low = $mid + 1;
        $container[$mid] > $search && $top = $mid - 1;
    }
}


/**
 * 递归版 二分查找
 *
 * @param array  $container
 * @param        $search
 * @param int    $low
 * @param string $top
 * @return int|string
 */
function BinaryQueryRecursive(array $container, $search, $low = 0, $top = 'default')
{
    $top === 'default' && $top = count($container);
    if ($low <= $top) {
        $mid = intval(floor($low + $top) / 2);
        if (!isset($container[$mid])) {
            return '没找着哦';
        }
        if ($container[$mid] == $search) {
            return $mid;
        }
        if ($container[$mid] < $search) {
            return BinaryQueryRecursive($container, $search, $mid + 1, $top);
        } else {
            return BinaryQueryRecursive($container, $search, $low, $mid - 1);
        }
    }
}

// +--------------------------------------------------------------------------
// | 方案测试    | php `this.php` || PHPStorm -> 右键 -> Run `this.php`
// +--------------------------------------------------------------------------

var_dump(BinaryQuery([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 9));
/*
 * double(8)
 */
var_dump(BinaryQueryRecursive([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 9));
/*
array(7) {
    [0] =>
  int(3)
  [1] =>
  int(4)
  [2] =>
  int(5)
  [3] =>
  int(6)
  [4] =>
  int(7)
  [5] =>
  int(8)
  [6] =>
  int(9)
}
*/

本文PHP经典算法之二分查找到此结束。不实心不成事,不虚心不知事;不自是者博闻,不自满者受益。小编再次感谢大家对我们的支持!

您可能有感兴趣的文章
PHP性能优化案例分享

PHP实现短信验证码的发送次数限制

PHP中的异常处理机制深入讲解

PHP常见七种算法合集代码实例

PHP微信扫描二维码关注公众号后自动登录第三方网站