php冒泡排序细分析

PHP有4种基本排序算法,分别是:冒泡排序,选择排序,插入排序,快速排序。

本篇文章给初学者细讲下冒泡排序。

首先是一个数组:

$ars = [4,3,5,9,6,2];

这是一个有6个元素的数组,那么开始使用冒泡排序,首先理解下冒泡排序,原理简单说明就是:两两比较,值大的往后放

那么问题来了,一共要比较多少次呢?我们先来看第一次比较

第一次:数组的第一个元素跟第二个元素比较,4>3,所以,4要往后放 [3,4,5,9,6,2]

第二次:数组的第二个元素(这时候已经是4了,不是3了)跟第三个元素比较,4<5,不动 [3,4,5,9,6,2]

第三次:数组的第三个元素跟第四个元素比较,5<9,不动 [3,4,5,9,6,2]

第四次:数组的第四个元素跟第五个元素比较,9>6,9要往后放 [3,4,5,6,9,2]

第五次:数组的第五个元素跟第六个元素比较,9>2,9要往后放 [3,4,5,6,2,9]

第六次:第六个元素没有比较对象,所以结束了(很多人迷惑为什么代码是那样写的,问题可能就在这里)

5次比较下来,只得到一个9在最后面,那么就需要循环来遍历不断的进行第二轮的比较

注意:第二轮比较只需要4次,因为上面5次比较已经得到最大值了,也就是说已经冒泡成功了一个

由此可以得到逻辑:

1、循环轮次:数组长度-1次,(为什么减一?看上面第六次的解释)

2、每轮需要循环的次数:数组的长度-当前正在循环的轮次(解释:因为每循环一轮就会冒泡一次,已经冒泡成功了的就不需要再进行比较了,拿上面的数组为例:一共5轮,每轮冒泡后,进入下一轮的循环就要减去上一轮,也就是说第二轮只需要循环4次)

3、每轮每次的循环比较是前一个元素跟后一个元素比较,上面5次解释已经说的很清楚了

4、每次得到的结果,如果符合大小对比,就把大的值往后放,也就是值对调

由上面的逻辑可得到如下代码:

<?php
$ars = [4,3,5,9,6,2];
$len = count($ars);
for($i=1;$i<$len;$i++){
    //此循环是控制一共要多少轮
    for($k=0;$k<$len-$i;$k++){
        //此循环是控制每轮需要循环多少次
        if($ars[$k] > $ars[$k+1]){
            //此判断是比较值的大小,进行值对调
            $temp = $ars[$k+1];
            $ars[$k+1] = $ars[$k];
            $ars[$k] = $temp;
        }
    }
}
?>

如果你要封装成一个类,那么请复制下面的代码:

<?php
/**
 * @author 代码要往死里写才有用
 * @since 2018.11.18 20:28
 * PHP冒泡排序类
 */
class Mp 
{
    public $arrays;
    public $len;

    /**
     * 构造函数
     * 初始化数组
     */
    public function __construct($array_to)
    {
        //如果可以,你可以加上变量类型控制
        $this->arrays = $array_to;
        $this->len = count($array_to);
    }

    /**
     * 冒泡排序
     */
    public function getMp()
    {
        try
        {
            for($i=1;$i<$this->len;$i++){
                for($k=0;$k<$this->len-$i;$k++){
                    if($this->arrays[$k] > $this->arrays[$k+1]){
                        $up = $this->arrays[$k+1];
                        $this->arrays[$k+1] = $this->arrays[$k];
                        $this->arrays[$k] = $up;
                    }
                }
            }
        } catch( Exception $e )
        {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
        }
        return $this->arrays;
    }
}
?>

其他排序,后文更进!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值