zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    java1.8--OptionalInt,OptionalDouble,OptionalLong类
    java1.8--Optional类
    java1.8--Null Object模式
    JDK自带的缓存--包装类的缓存
    函数式编程--lambda表达式对比匿名内部类
    java1.8--改进的接口
    Mybatis Generator(定制化)代码生成器
    Mybatis
    git fork
    git原理图解
  • 原文地址:https://www.cnblogs.com/helloJiu/p/6094981.html
Copyright © 2011-2022 走看看