冒泡排序

起因

在面试或者平时开发工作中时不时都会用到冒泡排序,其实本人一直以来只知道却没有深刻理解,特意记录下来并解析加强理解。

原理

对一组数据,比较相邻数据的大小,将值小的数据放在前面,值大的数据放在后面
举例说明 $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);

参考链接: 向北的个人博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值