• PHP二分查找(递归和循环)


    二分查找可以通过递归和循环来实现,

    思路如下:

      将要查找的数和中间数进行比较,

      如果相等,则表示找到,返回下标

      如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等于middle-1,直接等于middle,如果查找不到,会造成死归,

      如果要查找的数大于中间这个数,则说明要查找的数分布在数组的右边,修改left边界,使其等于middle+1,直接等于middle,如果查找不到,也会造成死归,

      递归查找,使用一个静态变量保存下标,

      没有查到,则返回-1

      代码如下:

      

     1 //递归二分查找
     2 
     3 function binarySearchByRecursion($arr,$val,$left,$right){
     4     static $index = -1;
     5     
     6     if($left>$right){
     7         return $index;
     8     }
     9     $middle = floor(($left+$right)/2);
    10 
    11     if($val < $arr[$middle]){
    12         //如果$middle不-1,则挑不出去,会一直递归下去
    13         $right = $middle-1;
    14         binarySearchByRecursion($arr,$val,$left,$right);
    15     }elseif($val > $arr[$middle]){
    16         $left = $middle+1;
    17         binarySearchByRecursion($arr,$val,$left,$right);
    18     }else{
    19         $index = $middle;
    20     }
    21     return $index;
    22 }
    23 
    24 //循环二分查找
    25 //
    26 function binarySearchByLoop($arr,$val){
    27     $index = -1;
    28     $left = 0;
    29     $right = count($arr)-1;
    30     
    31     while($left <= $right ){
    32 
    33         $middle = round(($left+$right)/2);
    34         if($val < $arr[$middle]){
    35             $right = $middle - 1;
    36         }elseif($val > $arr[$middle]){
    37             $left = $middle + 1;
    38         }else{
    39             $index = $middle;
    40             break;
    41         }
    42     }
    43     return $index;
    44 }
  • 相关阅读:
    Angular之ngRoute与uiRoute
    Python实现网络测速--转载
    You are using pip version 10.0.1, however version 20.2.2 is available.
    Pycharm导出环境,实现环境迁移
    Python编辑器之pycharm2020.1破解汉化
    Rsyslog系统日志转发
    服务器DNS配置
    服务器系统配置初始化脚本
    系统巡检用到的参数
    inotify高效监控Linux文件系统事件
  • 原文地址:https://www.cnblogs.com/helloJiu/p/6094981.html
Copyright © 2020-2023  润新知