老生常谈之 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 协议》,转载必须注明作者和本文链接
推荐文章: