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

        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 “查无此人”;

    }

  }

原文地址:https://www.cnblogs.com/wangboshen/p/7359629.html