氣泡排序原理
氣泡排序對一個陣列裡的數字進行排序,把陣列裡兩個相鄰的數比較大小,將值小的數放在前面,把大的數往後面放,當然這種排序是升序,即從小到大。
舉例說明
$array = [64, 56, 31, 68, 6];
陣列中有五個元素,按照原理說法,再詳細說一下做幾輪比較和比較的細節。
第一輪[64, 56, 31, 68, 6]:
第一次比較是拿64和56比較,也就是$array[0] 和 $array [1] 比較,因為64比56大,那麼56放在前面,64放在後面,結果為 [56, 64, 31, 68, 6]
第二次比較是拿64和31比較,也就是$array[1] 和 $array [2] 比較,因為64比31大,那麼31放在前面,64放在後面,結果為 [56, 31, 64, 68, 6]
第三次比較是拿64和68比較,也就是$array[2] 和 $array [3] 比較,因為68比64大,那麼64保持在前,68保持在後,結果為 [56, 31, 64, 68, 6]
第四次比較是拿68和6比較 ,也就是$array[3] 和 $array [4] 比較,因為68比6 大,那麼6放在前面, 68放在前面,結果為 [56, 31, 64, 6, 68]
到此,第一輪比較結束,從最後的結果裡[56, 31, 64, 6, 68]看出,並沒有按照從小到大的結果排列,但是68作為陣列裡最大的值,已經放到了最後面,我們下次排序是不是可以不管最後一個數了?
由此可想而知,第二輪就少了一次比較,也就是三次就可以了,以此推理,比較的次數越來越少。
第二輪[56, 31, 64, 6, 68]:
第一次比較是拿56和31比較,也就是$array[0] 和 $array [1] 比較,因為56比31大,那麼31放在前面,56放在後面,結果為 [31, 56, 64, 6, 68]
第二次比較是拿56和64比較,也就是$array[1] 和 $array [2] 比較,因為64比56大,那麼56保持在前,64保持在前,結果為 [31, 56, 64, 6, 68]
第三次比較是拿64和6 比較,也就是$array[2] 和 $array [3] 比較,因為64比6 大,那麼6 放在前面,64放在後面,結果為 [31, 56, 6, 64, 68]
到此,結果為[31, 56, 6, 64, 68],繼續~
第三輪[31, 56, 6, 64, 68]:
第一次比較是拿56和31比較,也就是$array[0] 和 $array [1] 比較,因為56比31大,那麼31保持在前,56保持在前,結果為 [31, 56, 6, 64, 68]
第二次比較是拿56和6 比較,也就是$array[1] 和 $array [2] 比較,因為56比 6大,那麼 6放在前面,56放在後面,結果為 [31, 6, 56, 64, 68]
到此,結果為[31, 6, 56, 64, 68],繼續~
第四輪[31, 6, 56, 64, 68]:
最後一次比較是拿31和6比較,也就是$array[0] 和 $array [1] 比較,因為31比6大,那麼6放在前面,31放在後面,結果為 [6, 31, 56, 64, 68]
到此,結果為[6, 31, 56, 64, 68],結束~
仔細觀察下,5個元素的陣列。比較了四輪,並且每輪比較的次數是逐漸減少的(-1)。對此我們可以用兩層迴圈即可完成,外層迴圈控制迴圈輪次,內層迴圈控制每輪的比較次數。
程式碼
<?php
//從小到大排序
function sort_arr($array){
$count = count($array);
$temp = 0; //臨時變數宣告
for($i = 0; $i < $count - 1; $i ++) { //控制輪數
for($j = 0; $j < $count - 1 - $i; $j ++) { //控制每輪次數
if ($array[$j] > $array[$j +1]) {
$temp = $array[$j]; //臨時變數存放
$array[$j] = $array[$j + 1]; //交換位置
$array[$j + 1] = $temp; //交換位置
}
}
}
return $array;
}
$array = [64, 56, 31, 68, 6];
print_r( sort_arr($array) );
Array
(
[0] => 6
[1] => 31
[2] => 56
[3] => 64
[4] => 68
)