---
# System prepended metadata

title: 氣泡排序 (Bubble sort)

---

# 氣泡排序 (Bubble sort)

## 簡介

氣泡排序法是一種比較基礎的算法，主要是透過比較前後兩數字的大小，並且兩兩交換，來完成排序動作。

冒泡排序法為**穩定排序法**。

## 算法

### 詳細步驟

1. 氣泡排序所需要的排序 **總回合數** 為 ***n - 1***
2. 透過創建兩個前後指針，來進行比對，如果前面的數字比後面的數字還要大，就把兩的數字對調

### 優化算法

在進行氣泡排序時，有時候會遇到中途已經排序好了(亦即這一輪前後比對的時候，前面的數字都比後面的數字來得小，沒有進行交換，這時候就可以判定已經排序完成)，但**總回合數**還沒有跑完的情況，
這時候就加入一個 **旗標** 來優化時間複雜度。

設定旗標初始值為 **False** ，只要在比較的時候，判斷這一回合如果有進行數字交換的話，就把旗標值設定為 **True** ，這樣在這一回合比較完成以後，判斷旗標為 **False** 的話，直接跳出迴圈即可，即可避免掉此類情況。

### 優化過後的詳細步驟

1. 氣泡排序所需要的排序**總回合數**為 ***n - 1***
2. 加入旗標，設定初始值為 **False**
3. 透過創建兩個前後指針，來進行比對，如果前面的數字比後面的數字還要大，就把兩的數字對調，並且設置旗標值為 **True**
4. 在總回合的迴圈裡(n-1)，判斷旗標值是否為 **True**，如果是的話即跳出迴圈，結束排序

## 時間複雜度
假設今天要對一陣列使用泡沫排序法由小到大排序。

### 最佳：O(n)
當資料順序恰好為由小到大時，第一輪排序未進行任何置換則提前結束。
### 平均：O(n^2^)
第 n 筆資料，平均需要比較 `(n-1)/2` 次
### 最差：O(n^2^)
當資料順序恰好為由大到小時，每輪分別執行：n-1、n-2、.. 、1次，`(n-1)+(n-2)+...+1 = n(n-1)/2` => O(n^2^)

## 參考資料
- [氣泡排序詳解](https://hackmd.io/@Aquamay/H1nxBOLcO/https%3A%2F%2Fhackmd.io%2F%40Aquamay%2FHyyCFRj9d)