• PHP中常见的四种算法


    分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 15,33,5,89,6,4

    1.冒泡排序

    原理分析:

    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    代码实现:

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 2017/10/30
     * Time: 16:23
     */
    $arr = [15,33,5,89,6,4];
    function bubbleSort($arr)
    {
        $count = count($arr);
        //该层循环控制 需要冒泡的轮数
        for ($i=0; $i<$count; $i++)
        {
            //该层循环用来控制每轮 冒出一个数 需要比较的次数
            for ($k=0; $k<$count-$i-1; $k++){
                if($arr[$k]>$arr[$k+1])
                {
                    $tmp = $arr[$k+1];
                    $arr[$k+1] = $arr[$k];
                    $arr[$k] = $tmp;
                }
            }
        }
        return $arr;
    }
    var_dump(bubbleSort($arr));
    

    最后结果:

    array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
    

    2.快速排序法

    原理分析:

    • 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    代码实现:

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 2017/10/30
     * Time: 17:26
     */
    $arr = [15,33,5,89,6,4];
    function quickSort($arr){
        //判断是不是还有进行
        if (count($arr)>1){
            //指定基准
            $k = $arr[0];
            //设置左边数组
            $x = [];
            //设置右边数组
            $y = [];
            for ($i=1; $i<count($arr); $i++)
            {
                //进行判断
                if ($k>$arr[$i]){
                    $x[] = $arr[$i];
                }else{
                    $y[] = $arr[$i];
                }
            }
            //递归执行
            $x = quickSort($x);
            $y = quickSort($y);
            //合并数组
            return array_merge($x,array($k),$y);
        }else {
            return $arr;
        }
    }
    var_dump(quickSort($arr));
    

    最后结果:

    array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
    

    3.选择排序法

    原理分析:

    • 在数组中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

    代码实现:

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 2017/10/30
     * Time: 18:10
     */
    $arr = [15,33,5,89,6,4];
    function selectSort($arr)
    {
        $count = count($arr);
        for($i=0; $i<$count-1; $i++) {
            //先假设最小的值的位置
            $p = $i;
            for($j=$i+1; $j<$count; $j++) {
                //$arr[$p] 是当前已知的最小值
                if($arr[$p] > $arr[$j]) {
                    //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                    $p = $j;
                }
                //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
                if($p != $i) {
                    $tmp = $arr[$p];
                    $arr[$p] = $arr[$i];
                    $arr[$i] = $tmp;
                }
            }
        }
        //返回最终结果
        return $arr;
    }
    var_dump(selectSort($arr));
    

    最后结果:

    array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
    

    4.插入排序法

    原理分析:

    • 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

    代码实现:

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 2017/10/30
     * Time: 18:20
     */
    $arr = [15,33,5,89,6,4];
    function insertSort($arr)
    {
        $count = count($arr);
        for($i=1; $i<$count; $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;
                }
            }
        }
        return $arr;
    }
    var_dump(insertSort($arr));
    

    最后结果:

    array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
    

    算法是一门高深的学问 :)

  • 相关阅读:
    AES加密demo
    js处理文本中特殊字符
    mybatis关联查询举例
    mysql杀进程脚本
    设置连接超时,connectTimeOut与readTimeOut需要同时设置
    JVM学习笔记(四)------内存调优
    JVM学习笔记(三)------内存管理和垃圾回收
    JVM学习笔记(二)------Java代码编译和执行的整个过程
    JVM学习笔记(一)------基本结构
    HTML常用标签及其全称
  • 原文地址:https://www.cnblogs.com/jhcyzxx/p/10479780.html
Copyright © 2020-2023  润新知