侯体宗的博客
  • 首页
  • Hyperf2.1版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php常用算法整合,持续更新

php  /  管理员 发布于 2年前   505

冒泡排序:

    /**
    * @param $arr
    * 冒泡排序算法的原理如下:
    * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    * 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    * 3.针对所有的元素重复以上的步骤,除了最后一个。
    * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    */
   private function bubbleSort($arr)
   {
       //获取 长度
       $len = count($arr);
       //循环比较(相邻的两个元素,比较,交换)
       for ($k = 0; $k <= $len; $k++) {
           for ($j = $len - 1; $j > $k; $j--) {
               //比较
               if ($arr[$j] < $arr[$j - 1]) {
                   //交换
                   $temp = $arr[$j];
                   $arr[$j] = $arr[$j - 1];
                   $arr[$j - 1] = $temp;
               }
           }
       }
       return $arr;
   }

快速排序

  /** @param $arr
     * 快速排序算法原理如下:
     *  1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边
     *  2.继续递归用相同的方式来排序左边和右边
     *  3.最后合并数组
     */
    function quick_sort($arr)
    {
      //先判断是否需要继续进行
      $length = count($arr);
      if($length <= 1){ return $arr; }
      $base_num = $arr[0];//选择一个标尺 选择第一个元素
      //初始化两个数组
      $left_array = array();//小于标尺的
      $right_array = array();//大于标尺的
      for($i=1; $i<$length; $i++){     
      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
        if($base_num > $arr[$i]){
          //放入左边数组
          $left_array[] = $arr[$i];
        }else{
          //放入右边
          $right_array[] = $arr[$i];
        }
      }
      //再分别对 左边 和 右边的数组进行相同的排序处理方式
      //递归调用这个函数,并记录结果
      $left_array = quick_sort($left_array);
      $right_array = quick_sort($right_array);
      //合并左边 标尺 右边
      return array_merge($left_array, array($base_num), $right_array);
    }
    $arr = array(3,1,2);
    var_dump(quick_sort($arr));

二分查找算法(折半查找算法)

    /**
     * @param $x ;@param $a
     * 二分查找,需要数组是一个有序数组
     * 循环实现
     */
    private function binLoop($x, $a)
    {
        $c = count($a);
        $lower = 0;
        $high = $c - 1;
        while ($lower <= $high) {
            //取中间值
            $middle = intval(($lower + $high) / 2);//intval() 函数用于获取变量的整数值
            //比较(一半一半的比),必须是有序数组
            if ($a[$middle] > $x) {
                $high = $middle - 1;//在前一半里查
            } elseif ($a[$middle] < $x) {
                $lower = $middle + 1;//在后一半里查
            } else {
                return $middle;
            }
        }
        return false;
    }
    /**
     * @param $x ; @param $a ;@param $lower ;@param $high
     * 二分查找,需要数组是一个有序数组
     * 递归实现
     */
    private function binRecursive($x, &$a, $lower = 0, $high = 11)
    {
        //$lower开始位置 $high结束位置
        //采用二分法查找
        $c = count($a);
        if ($high > $c) {
            return false;
        }
        if ($lower <= $high) {
            $middle = intval(($lower + $high) / 2);
            if ($a[$middle] == $x) {
                return $middle;
            } elseif ($a[$middle] < $x) {//在后半段里查
                return $this->binSearchRecursive($x, $a, $middle + 1, $high);
            } else {//在前半段里查
                return $this->binSearchRecursive($x, $a, $lower, $middle - 1);
            }
        } else {
            return false;
        }
    }

顺序查找

从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
function seqSearch($arr,$toSearch)
{
   $nCount = count($arr);
   for ($i=0; $i < $nCount; $i++) {
       if ($arr[$i] == $toSearch) {
           return $i;
       }
   }
   return -1;
}

无限级分类

function tree($arr,$pid=0,$level=0){
        static $list = array();
        foreach ($arr as $v) {
            //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
            if ($v['pid'] == $pid) {
                $v['level'] = $level;
                $list[] = $v;
                tree($arr,$v['id'],$level+1);
            }
        }
        return $list;
}

遍历一个文件下的所有文件和子文件夹下的文件

function AllFile($dir){
    if($dh = opendir($dir)){
        while (($file = readdir($dh)) !== false){
            if($file !='..' && $file !='.'){
                if(is_dir($dir.'/'.$file)){
                    AllFile($dir.'/'.$file);    //如果判断还是文件,则递归
                }else{  
                    echo $file;         //输出文件名
                }
            }
        } 
    }
}



  • 上一条:
    关于猴子选大王的面试题
    下一条:
    centos7中mysql备份并在另一台服务器上还原恢复_mysqldump
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • TP(3/5)
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • PHP + Memcache实现简单的统计当前在线人数功能(0个评论)
    • 红包算法之二倍均值算法-php、js版示例代码(0个评论)
    • 2022年最新PHP(八股文)面试题附答案,建议收藏(0个评论)
    • 最新版php8.1.3于2022年2月17日发布(0个评论)
    • PHP语言实现流接口模式示例代码(0个评论)
    • 近期文章
    • redis安全配置之修改端口、添加密码流程步骤及启动使用(0个评论)
    • PHP + Memcache实现简单的统计当前在线人数功能(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • go语言中使用Signbit()函数判断一个整数是正数或负数(0个评论)
    • 删库跑路之一链家程序员删除公司9TB数据被判7年,望各大码农警之!(0个评论)
    • Laravel角色和权限:拦截器Gates和策略Policies的解释(0个评论)
    • Laravel 9.12版本发布(0个评论)
    • go语言中实现把数据写入文件函数WriteFile()编写(0个评论)
    • go语言之如何加入字符串?(0个评论)
    • go语言之以x因子的倍数重复一个字符(0个评论)
    • 近期评论
    • 博主 在

      hyperf框架常用命令-在centos7中退出命令及在docker容器中退出命令中评论 @路过的靓仔:cdn静态资源被墙,已修复..
    • GGGGGGGGG 在

      layui框架常用输入框介绍中评论 写的很好解决问题..
    • 路过的靓仔 在

      hyperf框架常用命令-在centos7中退出命令及在docker容器中退出命令中评论 剩下好多 wait 状态的..
    • 激光豆芽 在

      为什么你不能安逸?国内996为什么没有国外955香?中评论 国内现在无意义的内卷太多了..
    • 激光豆芽 在

      阿里云香港服务器搭建自用vpn:Shadowsocks使用流程步骤中评论 厉害了..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客