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

 

語言組織待完善,歡迎反饋@

相關文章
相關標籤/搜索