php实现经典算法

冒泡:

function bub_sort($array){
      $n = count($array);
            for($i=0; $i<$n; $i++){
                    for($j=$i+1; $j<$n; $j++){
                            if($array[$i]>$array[$j]){
                                    $temp = $array[$i];
                                    $array[$i] = $array[$j];
                                    $array[$j] = $temp;
                            }
                    }
            }
            var_dump($array);
    }
    bub_sort([3,2,1,5,7,3]);

直接插入排序:

function ins_sort($array){
             $len = count($array);
             for($i=1;$i<$len;$i++){
                     $temp = $array[$i];
                     for($j=$i-1;$j>=0;$j--){
                             if($temp<$array[$j]){
                                     $array[$j+1] = $array[$j];
                                     $array[$j] = $temp;
                             }
                             else{
                                     break;
                             }
                     }
             }
             var_dump($array);
     }

     ins_sort([3,1,2,5,7,10,9,8]);

直接选择排序:

function sel_sort($array){
             $len = count($array);
             for($i=0;$i<$len-1;$i++){
                     $p = $i;
                     for($j=$i+1;$j<$len;$j++){
                             if($array[$j]>$array[$p]){
                                     $p = $j;
                             }
                     }
                     $temp = $array[$p];
                     $array[$p] = $array[$i];
                     $array[$i] = $temp;
             }
             var_dump($array);
     }

     sel_sort([2,1,3,4,6,9,5,7,1]);

堆排序:

function swap(&$array,$a,$b){
        $temp = $array[$a];
        $array[$a] = $array[$b];
        $array[$b] = $temp;
}

function buildMaxHeap(&$array,$len){
        for($i=intval($len/2)-1;$i>=0;$i--){
                $l = $i*2 + 1;
                $max = $l;
                if($len>$l){
                        $r = $l+1;
                        if($len>$r){
                                if($array[$r]>$array[$l]){
                                        $max = $r;
                                }
                        }
                        if($array[$max]>$array[$i]){
                                swap($array,$max,$i);
                        }
                }
        }
}

$array = [3,2,4,5,7,1,8];
$len = count($array);
buildMaxHeap($array, $len);
for($i=$len-1;$i>0;$i--){
        swap($array,$i,0);
        $len--;
        buildMaxHeap($array,$len);
}

var_dump($array);

快速排序:

function quick_sort($array){
              $len = count($array);
              if($len<2){
                      return $array;
              }
              $right = $left = [];
              for($i=1;$i<$len;$i++){
                      if($array[$i]<$array[0]){
                              $left[] = $array[$i];
                      }
                      else{
                              $right[] = $array[$i];
                      }
              }
              $left = quick_sort($left);
              $right = quick_sort($right);
              return array_merge($left,[$array[0]],$right);
      }

      var_dump(quick_sort([2,1,2,3,6,5,7]));

归并排序:

$array = [5,4,3,8,8,1,6];
    function merge_sort(&$array){
            $len = count($array);
            if($len<=1){
                    return $array;
            }
            $middle = intval($len/2);
            $left = array_slice($array,0,$middle);
            $right = array_slice($array,$middle);
            merge_sort($left);
            merge_sort($right);
            $array = merge($right,$left);
    }

    function merge($right,$left){
            $merge = [];
            while(count($right) && count($left)){
                    if($right[0]>$left[0]){
                            $merge[] = array_shift($right);
                    }
                    else{
                            $merge[] = array_shift($left);
                    }
            }
            return array_merge($merge,$right,$left);
    }

    merge_sort($array);
    var_dump($array);

基数排序:把每位数分开,高位不存在的补零。从低位开始比较,比到高位完成排序:

  function base_sort(&$arr){//前提是数组都是正整数,且不为空

    $bit = 1;

    $len = count($arr);

    for($i=0; $i<$len; $i++){

       $strlen = strlen($arr[$i]);

       $bit = $strlen>$bit ? $strlen : $bit;

    }

    for($i=0; $i<$bit-1; $i++){

       $base = [];

       $divisor = pow(10,$i);

       for($j=0; $j<$len; $j++){

           $remain = $arr[$j]/$divisor%10;

           $base[$remain][] = $arr[$j];

       }

       $arr = [];

       for($k=0; $k<=9; $k++){

          if(isset($base[$k])){

              $arr = array_merge($arr,$base[$k]);

          }

       }

    }

}

$arr = [100,1,125,19999,9,808,28];

base_sort($arr);

var_dump($arr);
复杂度比较

二分查找(时间复杂度log2n):

function bin_sch($array,$start,$end,$value){
            if($start > $end){
                    var_dump('没有找到');
            }
            $mid =  intval(($start + $end) / 2);
            if($array[$mid] == $value){
                    var_dump($mid);
            }
            elseif($array[$mid] > $value){
                    bin_sch($array,$start,$mid-1,$value);
            }
            else{
                    bin_sch($array,$mid+1,$end,$value);
            }
    }

    bin_sch([1,2,3,4,6,8],0,5,6);

顺序查找:

seq_sch([3,2,5,6,1],5,6);
    function seq_sch($array,$n,$value){
            for($i=0; $i<$n; $i++){
                    if($array[$i] == $value){
                            var_dump($i);exit;
                    }
            }
            var_dump('没有找到');
    }

二维数组排序:

function two_array_sort($array,$key,$sort=SORT_ASC,$sort_type=SORT_NUMERIC){
            if(!is_array($array)){
                    return false;
            }
            $array_key = [];
            foreach($array as $value){
                    if(!is_array($value)){
                            return false;
                    }
                    $array_key[] = $value[$key];
            }
            array_multisort($array_key,$sort,$sort_type,$array);
            var_dump($array);
    }

    two_array_sort([['a'=>8,'b'=>2],['a'=>9,'b'=>2],['a'=>5,'b'=>2],['a'=>8,'b'=>2],['a'=>1,'b'=>2]], 'a');

抢红包:

function qhb($num,$money){
              if($money<$num*0.01){
                      return false;//保证每个人能有一分钱
              }
              for($i=1;$i<=$num;$i++){
                      if($i==$num){
                              $hb = $money;
                      }
                      else{
                              $max = round($money-($num-$i)*0.01, 2);//保证每个人能有一分钱
                              $max = round($max/($num-$i), 2);//让每个红包差距不是太大
                              $hb = mt_rand(0.01*100,$max*100)/100;
                              $money -= $hb;
                      }
                      var_dump([$i,$hb]);
              }
      }

      qhb(5,5);