1.冒泡算法
网上搜了很多,但是总是对于每次循环的边界值思路讲的比较笼统。不是很容易被新手记住,我自己平时也是硬记下来的。但是对于算法,硬记,时间长了还是容易忘记,所以自己写了一次,把每次思路尽量写下来,便于理解,理解了容易加深映像,不容易忘记了。
冒泡算法,核心就是
循环比对 每次比对相邻2个数组的大小,然后把最大的数组放到后面,这样所有比对循环一次,就会把数组中最大的数放到数组最后,
然后重复循环(重复上面的比对循环):此时循环的时候 最后一个值是不需要参加循环了,因为已经确定是最大的那个了。也就是说,重复循环,比对数组越来越少。最终只剩一个数组元素了。循环结束
代码层看,
$arr=array(5,4,3,6,7,1,2,10,8,9);
先从内层比对循环开始看
一般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边界值。
$xx第一次循环值是多少 是数组元素长度 count($arr)减 1 为什么呢?因为比对的时候 用到的$arr[$i+1] 。如果$xx等于数组长度,每次循环比对到最后的时候 $arr[$i+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++){ //对长度越来越少的一组数据 找出最大让其浮到最后 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是怎么确定边界值的 上面说了, $xx 边界值是 count($arr)-1 到 1 已经定义 那么数学算法 $k边界值也就出来了 为 1到 count($arr)-1
写入到循环里也就是 $k=1;$k<count($arr);$k++了。
语言组织的还是不太完善,等晚点再来整理。