• PHP实现八大算法


    交换函数:注意要按引用传递,否则无法真正交换两个数的值

    function exchange(&$a, &$b){
            $temp = $a;
            $a = $b;
            $b = $temp;
        }

    1、直接插入算法

    //第一种实现
      function insert_sort($arr){
            for ($i = 0; $i < count($arr)-1; $i++){
                for($j = $i+1; $j > 0; $j--){
                    if($arr[$j] > $arr[$j-1]){
                        exchage($arr[$j], $arr[$j-1]);
                    }
                }
            }
            return $arr;
        }
      //第二种实现
        function insert_sort($arr){
            for ($i = 0; $i < count($arr)-1; $i++){
                $j = $i + 1;
                while($j > 0){
                    if($arr[$j] > $arr[$j-1]){
                        exchage($arr[$j], $arr[$j-1]);
                    }
                    $j--;
                }
            }
            return $arr;
        }

    2、希尔排序算法【暂缺】

    3、直接选择排序算法

    function select_sort($arr){
            for($i = 0; $i < count($arr); $i++){
                $key = $arr[$i];
                $n = $i;
                for($j = $i+1; $j < count($arr); $j++){
                    if($key  > $arr[$j]){
                        $key  = $arr[$j];
                        $n = $j;
                    }
                }
                $arr[$n] = $arr[$i];
                $arr[$i] = $key;
            }
            return $arr;
        }

    4、堆排序算法【暂缺】

    5、冒泡排序算法

    //第一种
         function bubble_sort($arr){
            for($i = 0; $i < count($arr)-1; $i++){
                for($j = count($arr)-1; $j > $i; $j--){
                    if($arr[$j-1] < $arr[$j]){ 
                        exchage($arr[$j], $arr[$j-1]);
                    }
                }
            }
            return $arr;
        }
         //第二种
        function bubble_sort($arr){
            for($i = 0; $i < count($arr)-1; $i++){
                $j = 0;
                while($j < count($arr)-1-$i){
                    if($arr[$j] < $arr[$j+1]){
                        exchage($arr[$j], $arr[$j-1]);
                    }
                    $j++;
                }
            } 
            return $arr;
        }

    6、快速排序算法

    function quick_sort(&$arr, $p, $r){
            if($p < $r){
                $q = partition($arr, $p, $r);
                quick_sort($arr, $p, $q-1);
                quick_sort($arr, $q+1, $r);
            }
        }
        function partition(&$arr, $p, $r){
            $i = rand($p, $r);    //实现随机化快排
            exchange($arr[$i], $arr[$r]);
            $n=$p-1;
            for($m = $p; $m < $r; $m++){
                if($arr[$m] < $arr[$r]){
                    ++$n;
                    exchange($arr[$m], $arr[$n]);
                }
            }
            exchange($arr[$n+1], $arr[$r]);
    
            return $n+1;       //n位上的元素,一经排序,则已固定
        }

    7、归并排序算法【注意:数组按值传输】

    function merge_sort(&$A, $p, $r){
            if($p < $r){
                $q = floor(($p + $r)/2);
                merge_sort($A, $p, $q);
                merge_sort($A, $q+1, $r);
                merge($A, $p, $q, $r);
            }
        }
        //第一种
        function merge(&$A, $p, $q, $r){    //哨兵牌法
            $n1 = $q - $p + 1;
            $n2 = $r - $q;
            for($i = 0; $i < $n1; $i++){
                $L[$i] = $A[$p+$i];
            }
            for($j = 0; $j < $n2; $j++){
                $R[$j] = $A[$q+$j+1];
            }
            //防止越界(哨兵)
            $L[$n1] = $R[$n2] = PHP_INT_MAX;
            $i = $j = 0;
            for($k = $p; $k <= $r; $k++){
                if($L[$i] <= $R[$j]){
                    $A[$k] = $L[$i];
                    $i++;
                }else{
                    $A[$k] = $R[$j];
                    $j++;
                }
            }
        }
        //第二种
        function merge(&$A, $p, $q, $r){    
            $n1 = $q - $p + 1;
            $n2 = $r - $q;
            for($i = 0; $i < $n1; $i++){
                $L[$i] = $A[$p+$i];
            }
            for($j = 0; $j < $n2; $j++){
                $R[$j] = $A[$q+$j+1];
            }    
            $i = $j = 0;
            $k = $p;
            while($i<$n1 && $j<$n2){
                if($L[$i] <= $R[$j]){
                    $A[$k++] = $L[$i++];
                }else{
                    $A[$k++] = $R[$j++];
                }
            }
            
            for(; $i<$n1; $i++){
                $A[$k++] = $L[$i];
            }
            for(; $j<$n2; $j++){
                $A[$k++] = $R[$j];
            }
        }

    8、基数排序算法【暂缺】

    转载自:https://www.cnblogs.com/zixuanfy/p/7617451.html

  • 相关阅读:
    <摘录>如何在64位linux强制编译32位应用程序
    Ubuntu安装Java
    Mybatis学习
    Java小工具Lombok
    jenkins忘记admin密码的处理方法
    list删除元素
    ConcurrentHashMap详解
    用户登录
    SpringDemo01
    SpringBoot Eclipse 热部署
  • 原文地址:https://www.cnblogs.com/jierong12/p/10136242.html
Copyright © 2020-2023  润新知