zoukankan      html  css  js  c++  java
  • php冒泡算法

    1.冒泡算法

    网上搜了很多,但是总是对于每次循环的边界值思路讲的比较笼统。

    不是很容易被新手记住,我自己平时也是硬记下来的。

    但是对于算法,硬记,时间长了还是容易忘记,所以自己写了一次,把每次思路尽量写下来,便于理解,理解了容易加深映像,不容易忘记了。

    冒泡算法,核心就是

        1.循环比对  每次比对相邻2个数组的大小,然后把最大的数组放到后面,这样所有比对循环一次,就会把数组中最大的数放到数组最后

        2. 然后重复循环(重复上面的比对循环):此时循环的时候 最后一个值是不需要参加循环了,因为已经确定是最大的那个了。也就是说,重复循环,比对数组越来越少。最终只剩一个数组元素了。循环结束

    代码层看,

    $arr=array(5,4,3,6,7,1,2,10,8,9);

    先从两两比对开始看

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

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

  • 相关阅读:
    Jquery里live事件移除原因
    js委托事件-addEventListeners(冒泡方向)
    后端同同不肯给我算好的时间差给我,只好自己写了:
    js滚动到顶部底部代码
    浏览器地址栏运行HTML代码(谷歌)
    黑马vue---56-58、vue组件创建的三种方式
    黑马vue---46、vue使用过渡类名实现动画
    黑马vue---28、vue中全局过滤器的基本使用
    vue devtools无法使用
    红心点赞效果的实现
  • 原文地址:https://www.cnblogs.com/phpjinggege/p/8257851.html
Copyright © 2011-2022 走看看