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

转载于:https://www.cnblogs.com/jierong12/p/10136242.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值