冒泡排序屬於交換排序,基本思想:兩兩比較相鄰記錄,順序錯誤則交換。較小元素如氣泡般逐漸「浮」到序列頂端,故名。
void BubbleSort(int arr[], int n) {
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (arr[i] > arr[j]) swap(arr[i], arr[j]);
}
缺陷:不滿足「相鄰比較」特徵,實質是選擇排序變體。每輪將最小值交換到第 i 位。
void BubbleSort(int arr[], int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n-1-i; j++) // 或 j=n-2; j>=i; j-- 方向相反
if (arr[j+1] < arr[j]) swap(arr[j], arr[j+1]);
}
特徵:相鄰比較交換。每輪結束,最大值「沉」底或最小值「浮」頂。比較次數固定:n(n-1)/2。
void BubbleSort(int arr[], int n) {
bool flag = true;
for (int i = 0; i < n && flag; i++) {
flag = false;
for (int j = 0; j < n-1-i; j++)
if (arr[j+1] < arr[j]) {
swap(arr[j], arr[j+1]);
flag = true; // 發生交換,標記需繼續
}
}
}
優化點:若某輪無交換,說明已有序,立即終止外層循環。
| 情況 | 比較次數 | 交換次數 | 時間複雜度 |
|---|---|---|---|
| 最好(正序) | n-1 | 0 | O(n) |
| 最壞(逆序) | n(n-1)/2 | n(n-1)/2 | O(n²) |
| 平均 | ~n²/4 | ~n²/4 | O(n²) |
雖實戰罕用,但冒泡排序是理解排序算法演進邏輯的關鍵階梯。