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; } } }
語言組織待完善,歡迎反饋@