老生常谈之 PHP 基础排序算法

    每个 菜B 心中都有一个梦, 那就是 牛B. 让我们一起向前往 牛B 的路上再烧把火吧.

                                                                                        我说的

1. 冒泡排序#

当王老师第一次把 6,4,7,2,9,8,1 七个数字写到黑板上并开始提问:“你们有什么办法让这一坨数字从小到大排列呢?”,作为菜 B,你的第一想法肯定是先把脑袋深深淹没在书堆后并默念:“ 千万别点老子 ”。

                    把生活解释成代码叫编程, 把代码解释成生活叫逆向编程.

                                                                                    还是我说的

第一步,放代码,就是这么直接了当

function bubble(array $arr) : array 
{
    $start  = microtime(true);
    $length = count($arr);
    $swap = true;

    for ($outer = 0; $outer < $length && $swap; $outer++) {

        $swap = false;

        for ($inner = $length - 1; $inner > $outer; $inner--) {
            if ($arr[$inner] < $arr[$inner - 1]) {
                $temp            = $arr[$inner];
                $arr[$inner]     = $arr[$inner - 1];
                $arr[$inner - 1] = $temp;
                $swap            = true;
            }
        }
    }

    $end = microtime(true);

    return ['排序数组' => $arr, '冒泡排序执行时间' => $end - $start];
}

创建数据前,先来了解下人物数组:大胖 = 90Kg, 中胖 = 80Kg, 超胖 = 100Kg, 巨胖 = 200Kg, 小胖 = 70Kg 就这几个吧。不要在体重上计较是否命名合适,我说了算.
数据创建完成,然后命名为 $fatFat, 他们按照上边描述的位置 (数组下标) 已经站好了,要开始比体重了.

  • 1.1 王老师来数一下. $length = count($fatFat);

  • 1.2 开始循环比较了,第一层的循环是控制发起挑战次数并确定挑战位置的,条件为参与的胖子不得超过总胖子 (小于 $length), 挑战顺序为依次累加.

  • 1.3 发起挑战的是小胖 ($length - 1), 条件是应战者位置必须大于挑战开始位置,只有这样才能完成应战者后续比赛,所以第二层循环是控制挑战者顺序及位置的。挑战者顺序为依次递减.

  • 1.4 步骤 1.3 中,条件满足 ($inner > $outer), 小胖顺利过关,然后开始了冒泡的经典过程: 一战到底.

    为什么叫一战到底呢?(留做阅后感吧)

  • 1.5 小胖 ($inner) 与巨胖 ($inner - 1) 比赛后胜出 (“是的,一胖毁所有”), 要换座位了,先把胜了的小胖单独拎出来放到 $temp 里 (因为 $inner 比较轻), 然后把巨胖拖到原本属于小胖的位置,即 ($arr[$inner] = $arr[$inner - 1]), 接着让被寄存的小胖 ($temp) 坐到巨胖的板凳上 ($arr[$inner - 1] = $temp)

    此时,我们要理一下胖子们的位置,0=> 大胖,1=> 中胖,2=> 超胖,3=> 小胖,4=> 巨胖.
    没有反应过来的同学可以回顾下 步骤 1.5 中,关于换座位的描述.

  • 1.6 小胖接下来要重复 步骤 1.3 ~ 步骤 1.5 的骚操作,直到坐上第一 (下标为 0) 的宝座为止.

  • 1.7 开始新一轮挑战轮回赛,即步骤 1.2

  • 1.8 所有挑战者全部挑战完毕.

本文中的关于冒泡排序的文字描述是按照从后往前展开的. 代码来自于老李博客, 更多的解释可以去老李的博客浏览
老李乃泥腿子一枚, 但是却早早站到了 牛B 的路上. 要向我辈楷模学习.

申明: 文中所言没有歧视胖子的意思, 只是为了适应此境所拟, 若有不适, 请联系我修改.

参考文章: 排序算法之冒泡排序

本作品采用《CC 协议》,转载必须注明作者和本文链接
故地有明月,何慕异乡圆.
wenber
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。