你的冒泡排序写对了吗?

排序算法的好坏,决定着你的程序的效率, 需要从3个维度考虑.
a. 时间复杂度最好情况,最坏情况,平均情况
b.时间复杂度的系数, 常数, 低阶,通常是指数据规模
c.比较次数和交换次数

这里列举两种常见的冒泡算法

第一种外循环与内循环比较再交换

外循环的i每次都与内循环里的每一个元素进行比较, 再交换

function BubblingSort($list) {
    if(count($list) == 1) {
        return $list;
    }
    $len = count($list);
    for ($i = 0; $i < $len; $i ++ ) {
        for ($k = $i + 1; $k < $len; $k ++) {
            if ($list[$i] > $list[$k]) {
                $temp = $list[$i];
                $list[$i] = $list[$k];
                $list[$k] = $temp;
            }
        }
    }
}

第二种内循环相互比较,借用flag标记,减少循环次数

内循环前后比较,借用flag标记,如果是有序则不再循环.

function BubblingSort2($list) {
    if(count($list) < 2){
        return $list;
    }
    $len = count($list);
    for ($i = 0; $i < $len; $i ++ ) {
        $flag = false;
        for($j = 0; $j < $len - $i - 1; $j++ ) {
            if ($list[$j] > $list[$j + 1]) {
                $tmp = $list[$j];
                $list[$j] = $list[$j+1];
                $list[$j+1] = $tmp;
                $flag = true;
            }
        }
        if(!$flag) {
            break;
        }
    }
}

规模数据对比.

对比了, 10, 100, 1000, 10000四种规模的数据.发现无flag版本的效率所着数据规模越大,优势越明显.主要取决于交换的次数比较少. 耗时就短,程序运行速度更快.但flag版本循环次数要少,但交换次数增多.
在这里插入图片描述

源码,可以自行测试.github

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值