php常用算法整合,持续更新
php  /  管理员 发布于 5年前   849
冒泡排序:
    /**
     * @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;         //输出文件名
                }
            }
        } 
    }
}122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
			Copyright·© 2019 侯体宗版权所有·
			粤ICP备20027696号
			
			
