### 基本原理
在要排序的一組數中,對當前還未排好的序列,從前往后對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即每當兩相鄰的數比較后發現它們的大小順序相反時就將它們互換。
### 動畫演示

### 算法步驟
1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
3. 針對所有的元素重復以上的步驟,除了最后一個。
4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

### 代碼實現
```
// 冒泡排序
function bubbleSort($arr)
{
$length = count($arr);
if($length <= 1) { return $arr; }
for( $i = 0; $i < $length-1; $i ++ ) {
for( $j = 0; $j < $length-$i-1; $j ++ ) {
if( $arr[$j] > $arr[$j + 1] ) {
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
return $arr;
}
// 調用測試
$arr = [3,1,13,5,7,11,2,4,14,9,150,6,12,10,8];
print_r(bubbleSort($arr));
```
### 平均時間復雜度:O(n2)
若數組的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:Cmin = n - 1, Mmin = 0,所以,冒泡排序最好的時間復雜度為O(n)。
若初始數組是反序的,需要進行n-1趟排序。每趟排序要進行 n-i 次關鍵字的比較(1 ≤ i ≤ n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
Cmax = n(n-1)/2 = O(n2)
Mmax = 3n(n-1)/2 = O(n2)
冒泡排序的最壞時間復雜度為O(n2),綜上,因此冒泡排序總的平均時間復雜度為O(n2)。
### 小結
冒泡排序就是把小的元素往前調或者把大的元素往后調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們交換一下的;如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩定排序算法。