• 排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)


            PHP高级工程师之四种排序算法

        在这里和大家分享一下网络基本算法和查找。

        如有不善,多提意见(QQ:1595068971-邮箱:1595068971@qq.com)

    1.冒泡排序

      思路分析:从前往后相邻的两个数一次进行比较,大的往下沉,小的网上 冒。当相邻的两个数的比较后发现他们的排序与排序要求相反,就互换。

      代码实现

      $arr = array (1,42,33,69,7,82,34,54,70,99);

      $len = count($arr);

      For($i=1;$i<$len;$i++){

        For($j=0;$j<$len-$i;$j++){

          If($arr[$j] > $arr[$j+1]){

            $tmp = $arr[$j+1];

            $arr[$j+1]=$arr[$j];

            $arr[$j]=$tmp;

          }

        }

      } 外层循环此处,内层循环轮数(冒出一个,比较一次)

    2.选择排序

      思路分析:选出最小的一个数与第一位的数交换。然后在剩下的数当中再找最小的与第二位置的数交换,如此循环到最后为止。

      代码实现:

      $arr = array (1,42,33,69,7,82,34,54,70,99);

      $len = count($arr);

      For($i=0;$i<$len-1;$i++){

      $p=$i;  假设最小的值

        For($j=$i+1;$j<$len;$j++){

          If($arr[$p]>$arr[$j]){

            $p = $j; 发现更小的,记录下最小值的位置,下次用小的比

          }

        }

      已经确定了当前最小值的位置,保存到$p中,如果发现最小值的位置与当前假设的位置$i不同,则互换。

      If($p != $i){

        $tmp = $arr[$p];

        $arr[$p] = $arr[$i];

        $arr[$i] = $tmp;

      }

      }

    3.插入排序

      思路分析:把N个数插入到已排列好的顺序的数组中,使这N个数也是排序好的。

      代码实现:

      $arr = array (1,42,33,69,7,82,34,54,70,99);

      $len = count($arr);

      For($i=1;$i<$len;$i++){

        $tmp=$arr[$i];

        For($j=$i-1;$j>=0;$j--){

          If($tmp < $arr[$j]){ 发现插入的元素要小,交换位置.

            $arr[$j+1] = $arr[$j];

            $arr[$j] = $tmp;

          }else{

            Break;

          }

        }

      }

    4.快速排序

      思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。 通过一趟扫描,排序列分成两部分,一部分比基准元素小,一部分大于 等于基准元素此时基准        元素在其排好序后的正确位置,然后再用同样的 方法递归地排序划分的两部分

      代码实现:

      $arr = array (1,42,33,69,7,82,34,54,70,99);

      Function digui($arr){

        $len = count($arr);

        If($len <= 1){

          Return $arr;  是否要继续执行

        }

      $base_num = $arr[0];

      $left_array = array();

      $right_array = array();

      For($i=1;$i<$len;$i++){

        If($base_num > $arr[$i]){

          $left_array[] = $arr[$i];

        }else{

          $right_array[] = $arr[$i];

        }

      }

      $left_array = digui($left_array);

      $right_array = digui($right_array);

      Return array_merge($left_array,array($base_num),$right_array);

      }  

                                两种查找算法

    1.二分查找

      思路分析:

        1.先取数组中间的值floor(low+top/2)

        2.然后通过与所需查找的数字进行比较,若比中间值大,则将首位 替换 中间位置的下一位,继续第一步的操作。若比中间值小, 则将尾值 替换 为中间值的上  一个位置,继续第一步操作。

        3.重复第二步操作直到找出目标数字。

      比如从1,3,9,23,54中查找23。

      首位置为0。尾位置为4,中间位置为2值为9,比23小。则首位置 新为2+1既为3。那么接下来中间位置就为(3+4)/2=3, 值为 23,比 较相等既找到。

      代码实现:

      非递归:

      $target是要查找的目标 $arr是已经排序好的数组

      function binary(&$arr,$low,$top,$target){

        while($low <= $top){//由于php取商是有小数的,所以向下取整,不过也可不加,数组也会取整

          $mid = floor(($low+$top)/2);

           if($arr[$mid]==$target){

                             return $mid;

                           }elseif($arr[$mid]<$target){

                             $low = $mid+1;                

                        }else{

                             $top = $mid-1;

                      }

                  }

                  return -1;

      }$arr = array(1,3,9,23,54);echo binary($arr, 0, sizeof($arr), 9)

      

      递归:

      function binaryRecursive(&$arr,$low,$top,$target){

         if($low<=$top){

          $mid = floor(($low+$top)/2);

            if($arr[$mid]==$target){

              return $mid;

            }elseif($arr[$mid]<$target){

              return binaryRecursive($arr,$mid+1,$top,$target);

            }else{

              return binaryRecursive($arr,$low,$mid-1,$target);

            }

        }else{

          return -1;

        }

      }

      $arr = array(1,3,9,23,54);

      echo binaryRecursive($arr, 0, sizeof($arr), 9);

    1.快速查找

      思路分析:太简单 直接上代码。

      代码实现:

      $arr = array(40,99,700,0,-5);

      Function search($arr,$findVal){

        $flag = false;

        For($i=0;$i<count($arr);$i++){

          If($findVal==$arr[$i]){

            Echo “找到了,下标=$i”;

            $flag = true;

          }

        }

        If(!$flag){

          Echo “查无此人”;

        }

      }

  • 相关阅读:
    Xenserver中SR、VBD和VDI之间的关系
    rabbitmq镜像模式设置策略以及高可用
    MySQL主从复制配置详解
    xen 虚拟机挂了,宿主机假死的问题追终,全思路
    XenServer中备份正在运行的虚拟机
    理解 Docker 容器退出码
    prometheus 监控之 进程监控(processexporter)
    XenServer 常见故障处理
    httpCurl封装
    工作中不要为了用系统而用系统
  • 原文地址:https://www.cnblogs.com/wangboshen/p/7359629.html
Copyright © 2020-2023  润新知