老生常谈之 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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!