冒泡排序透過重複遍歷陣列,比較相鄰元素並交換順序,使較大(或較小)元素像氣泡一樣逐漸「浮」至陣列末端。屬於原地排序、穩定排序。
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 最佳時間 | O(n) | 已有序,單次遍歷無交換即可提前結束(需優化旗標) |
| 平均時間 | O(n²) | |
| 最差時間 | O(n²) | 逆序陣列 |
| 空間複雜度 | O(1) | 僅需常數額外空間 |
public class BubbleSort {
public static void sortDesc(int[] arr) {
if (arr == null || arr.length <= 1) return;
int n = arr.length;
boolean swapped;
for (int i = 0; i < n - 1; i++) {
swapped = false;
// 每輪將當前最大值推至末端,已排區間 [n-i, n-1] 無需再比較
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] < arr[j + 1]) { // 遞減:前小於後則交換
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
swapped = true;
}
}
if (!swapped) break; // 本輪無交換 → 已有序
}
}
public static void main(String[] args) {
int[] data = {8, 19, 88, 16, 34, 3, 10, 21};
sortDesc(data);
System.out.println(Arrays.toString(data)); // [88, 34, 21, 19, 16, 10, 8, 3]
}
}
n - 1 - i:每輪確定一個最大值,減少比較次數。swapped 旗標提前終止:若某輪無交換,代表陣列已有序,直接跳出。arr[j] < arr[j+1] 時交換,相等元素不交換,保持相對順序。雙向冒泡(左→右推最大、右→左推最小),對「小數值在右端」的近似有序陣列效能較佳,但最差仍為 O(n²)。
Arrays.sort()(雙軸快排 + 歸併,O(n log n))或 Collections.sort()。i)→ 多做無效比較、甚至越界。swapped 優化 → 已有序陣列仍跑完 O(n²) 輪。a=b; b=a;)。