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