起因
在面试或者平时开发工作中时不时都会用到冒泡排序,其实本人一直以来只知道却没有深刻理解,特意记录下来并解析加强理解。
原理
对一组数据,比较相邻数据的大小,将值小的数据放在前面,值大的数据放在后面
举例说明 $arr = array(6, 3, 8, 2, 9, 1);
$arr 有6个数据,按照两两比较大小如下,注意 比较轮数 和 每轮比较次数
第一轮排序
第一次比较 6和3比较 结果: 3 6
8 2 9 1
第二次比较 6和8比较 结果: 3 6 8
2 9 1
第三次比较 8和2比较 结果: 3 6 2 8
9 1
第四次比较 8和9比较 结果: 3 6 2 8 9
1
第五次比较 6和3比较 结果: 3 6 2 8 1 9
第一轮次比较结果:9已经冒泡出来了,下一轮可以不用比较;
排序第 1 轮 比较5次
第二轮排序
第一次比较 3和6比较 结果: 3 6
2 8 1 9
第二次比较 6和2比较 结果: 3 2 6
8 1 9
第三次比较 6和8比较 结果: 3 2 6 8
1 9
第四次比较 8和1比较 结果: 3 6 2 1 8
9
第二轮次比较结果:8已经冒泡出来了,下一轮可以不用比较;
排序第 2 轮 比较4次
第三轮排序
第一次比较 3和6比较 结果: 3 6
2 1 8 9
第二次比较 6和2比较 结果: 3 2 6
1 8 9
第三次比较 6和1比较 结果: 3 2 1 6
8 9
第三轮次比较结果:6已经冒泡出来了,下一轮可以不用比较;
排序第 3 轮 比较3次
第四轮排序
第一次比较 3和6比较 结果: 2 3
1 6 8 9
第二次比较 6和2比较 结果: 2 1 3
6 8 9
第四轮次比较结果:3已经冒泡出来了,下一轮可以不用比较;
排序第 4 轮 比较2次
第五轮排序
第一次比较 3和6比较 结果: 1 2
3 6 8 9
第五轮次比较结果:2已经冒泡出来了,因此最后一个数字1自动排到第一位,不用再比较了;
排序第 5 轮 比较1次
结论
对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。
代码
$list = array(2,6,4,7,3,1,5,9,8,10);
//按照从小到大排序
function bundle_order($arr){
$num = count($arr);
$tmp = 0;
if($num){
//外层控制排序轮次
for($i = 0; $i < $num-1; $i++){
//内层控制每轮比较次数
for($j = 0; $j < $num-1-$i; $j++){
//由于数组的索引是从0开始的,为了方便,我们设置$j也从0开始,因此需要在循环最大值上也减去1
if($list[$j] > $list[$j+1]){
$tmp = $list[$j];
$list[$j] = $list[$j+1];
$list[$j+1] = $tmp;
}
}
}
}else{
echo '空数组';
}
}
$res = bundle_order($list);
var_dump($res);
参考链接: 向北的个人博客