常用算法PHP版(二)- 冒泡排序

在这里插入图片描述
数值越大,排的位置越高。数值越小,就会一直被换到最底部去。
不好说明。。换一种说法,当一个数组为 [1,0],0比1小吧?冒泡排序就会把0和1换个位置,使0(最小的)在最前面,1(最大的)在最后面。变成[0,1]

冒泡排序

/**
 * 冒泡排序
 *
 * 注释的数据为第一轮循环
 * @param array $arr 数组
 * @return mixed
 */
function bubbling($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) { // 从0开始的,所以减1,下标0-4共5个数字
        for ($j = 0; $j < $len - $i - 1; $j++) { // 往下有解释 “-$i”
            if ($arr[$j] > $arr[$j + 1]) { // 如果0下标的值大于1下标的值,不符合,所以往下看下一轮
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }

    return $arr;
}

$arr = [1, 4, 3, 5, 2];
var_dump(bubbling($arr));

第二轮循环,注释的为第二轮循环的说明

function bubbling($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        for ($j = 0; $j < $len - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) { // 如果下标1的值大于下标2的值,4>3
                $temp = $arr[$j]; // 把下标1的值(4)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
                $arr[$j] = $arr[$j + 1]; // 将下标2的值(3)赋值到下标1的位置
                $arr[$j + 1] = $temp; // 再把临时存放的下标1的值(4),移动到下标2的位置,实现换位
            }
        }
    }

    return $arr;
}

第二轮的结果为:$arr = [1, 3, 4, 5, 2];

第三轮循环因为下标2的值(4)不大于下标3的值(5),过

第四轮下标3的值(5)大于下标4的值(2),使它们互换位置,结果为:$arr = [1, 3, 4, 2, 5];

这也就是内层for循环的作用,它一路比对,进行换位。使1, 4, 3, 5, 2变成1, 3, 4, 2, 5

外层for循环+1,外层for执行第二次

第一轮循环,$arr = [1, 3, 4, 2, 5] 下标0的值(1)不大于下标1的值(3),过

第二轮循环,$arr = [1, 3, 4, 2, 5] 下标1的值(3)不大于下标2的值(4),过

第三轮循环,注释的为第三轮循环的说明

/**
 * $arr = [1, 3, 4, 2, 5];
 */
function bubbling($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) { // 此时$i为1
        for ($j = 0; $j < $len - $i - 1; $j++) { // $len - $i,是因为上面的那些循环使最大的那个数字会一直往右移动,直到没有比它大的就停下,所以最后那个数字就是最大的,已经确定了的,就不需要再次比对
            if ($arr[$j] > $arr[$j + 1]) { // 如果下标2的值(4)大于下标3的值(2)
                $temp = $arr[$j]; // 把下标2的值(4)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
                $arr[$j] = $arr[$j + 1]; // 将下标3的值(2)赋值到下标2的位置
                $arr[$j + 1] = $temp; // 再把临时存放的下标2的值(4),移动到下标3的位置,实现换位
            }
        }
    }

    return $arr;
}

第三轮结果为:$arr = [1, 3, 2, 4, 5]

因为上面已经$len - 1了,所以下标3和4不需要比对。

外层for循环+1,外层for执行第三次

第一轮循环,下标0的值(1)不大于下标1的值(3),过

第二轮循环,注释的为第二轮循环的说明

/**
 * $arr = [1, 3, 2, 4, 5]
 */
function bubbling($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) { // 此时$i为2
        for ($j = 0; $j < $len - $i - 1; $j++) { // $len - 2,经过俩次外层for循环后,已经确定了最大值与第二的值
            if ($arr[$j] > $arr[$j + 1]) { // 如果下标1的值(3)大于下标2的值(2)
                $temp = $arr[$j]; // 把下标1的值(3)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
                $arr[$j] = $arr[$j + 1]; // 将下标2的值(2)赋值到下标1的位置
                $arr[$j + 1] = $temp; // 再把临时存放的下标1的值(3),移动到下标2的位置,实现换位
            }
        }
    }

    return $arr;
}

第三轮循环结果为:$arr = [1, 2, 3, 4, 5]

继续会走外层for俩次。当然了,什么都不会被改变,因为已经得出结果了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值