排序算法的好坏,决定着你的程序的效率, 需要从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