1.冒泡算法算法
网上搜了不少,可是老是对于每次循环的边界值思路讲的比较笼统。数组
不是很容易被新手记住,我本身平时也是硬记下来的。spa
可是对于算法,硬记,时间长了仍是容易忘记,因此本身写了一次,把每次思路尽可能写下来,便于理解,理解了容易加深映像,不容易忘记了。code
冒泡算法,核心就是blog
1.循环比对 每次比对相邻2个数组的大小,而后把最大的数组放到后面,这样全部比对循环一次,就会把数组中最大的数放到数组最后,索引
2. 而后重复循环(重复上面的比对循环):此时循环的时候 最后一个值是不须要参加循环了,由于已经肯定是最大的那个了。也就是说,重复循环,比对数组愈来愈少。最终只剩一个数组元素了。循环结束数学
代码层看,for循环
$arr=array(5,4,3,6,7,1,2,10,8,9);
先从两两比对开始看class
if($arr[$i]>$arr[$i+1]){//相邻比较 这个应该比较容易理解吧 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; }
以上代码就是比对2个数组相邻的值大小,大的放后面。能够看出来 $i 最大就是数组索引前一位的,不然 $arr[$i+1]不存在了,没法比较。也就是说 $i<count($ar)-1;$i初始值为0循环
先从内层比对循环开始看
通常for循环 这么写
for($i=0;$i<$xx;$i++){ if($arr[$i]>$arr[$i+1]){//相邻比较 这个应该比较容易理解吧 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; } }
上面思路说了,每次比对循环都是从开头第一个元素开始 因此$i 起始值为0, 重复循环一次,下次循环就少比对一个元素。这里$xx要愈来愈小; 那这个$xx怎么肯定呢?
$xx第一次循环值是多少 ?上面两两比对得出结论 count($ar)-1
$xx 最后一次值该是多少呢?上面两两比对得出结论 是1。
也就是说 $xx 为 count($arr)-$k $k是累加的 比对循环可改成(重复循环每循环一次)
for($i=0;$i<count($arr)-$k;$i++){ if($arr[$i]>$arr[$i+1]){//相邻比较 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; } }
再看这个$k 想一想这个$k不就是随着重复循环在累增的吗? 把重复循环代码加上以下
for($k=1;$k<count($arr);$k++){ $xx = count($arr)-$k; //$k最大值为count($arr)-1 $k 初始值为count($arr)-1 for($i=0;$i<$xx;$i++){ //$xx最小值为 1 $xx最大值为 count($arr)-1 if($arr[$i]>$[$i+1]){ //$i最小值为0 $i最大值为 count($arr)-2 $temparr= $arr[$i]; $arr[$i] =$arr[$i+1]; $arr[$i+1] = $temparr; } } }
咱们再来看下$k是怎么肯定边界值的 上面说了, $xx 边界值是 count($arr)-1 到 1 已经定义 那么数学算法 $k边界值也就出来了 为 1到 count($arr)-1
写入到循环里也就是 $k=1;$k<count($arr);$k++了。
整理下就是
for($k=1;$k<count($arr);$k++){ for($i=0;$i<count($arr)-$k;$i++){ if($arr[$i]>$[$i+1]){ $temparr= $arr[$i]; $arr[$i] =$arr[$i+1]; $arr[$i+1] = $temparr; } } }
语言组织待完善,欢迎反馈@