php冒泡算法

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;
        }
    }
}

 

语言组织待完善,欢迎反馈@

相关文章
相关标签/搜索