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

管理员 发布于 4年前   473

冒泡排序:

    /**
    * @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;         //输出文件名
                }
            }
        } 
    }
}


请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

该博客于2020-12-7日,后端基于go语言的beego框架开发
前端页面使用Bootstrap可视化布局系统自动生成

是我仿的原来我的TP5框架写的博客,比较粗糙,底下是入口
侯体宗的博客

      订阅博客周刊

文章标签

友情链接

HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群
侯体宗的博客