冒泡排序透過 N 輪 遍歷,每輪將未排序區域的最大元素「冒泡」至正確位置。第 1 輪定最大值於末端,第 2 輪定次大值於倒數第二,以此類推。
package al;
public class BubbleSort {
/**
* 冒泡排序
* @param array 待排序陣列(原地排序)
* 時間複雜度:O(n²)
* 空間複雜度:O(1)
* 穩定性:穩定
*/
public void sort(int[] array) {
int n = array.length;
// 外層迴圈:控制排序輪數,共 n-1 輪
for (int i = 0; i <= n - 1; i++) {
// 內層迴圈:未排序區域 0 ~ n-1-i
// 每輪結束後,最大元素已沉至 n-1-i 位置
for (int j = 0; j < n - 1 - i; j++) {
if (array[j] > array[j + 1]) {
// 交換相鄰逆序對
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
public static void main(String[] args) {
BubbleSort sorter = new BubbleSort();
int[] elements = {14, 77, 21, 9, 10, 50, 43, 14};
System.out.print("排序前:");
printArray(elements);
sorter.sort(elements);
System.out.print("排序後:");
printArray(elements);
// 輸出:9 10 14 14 21 43 50 77
}
private static void printArray(int[] arr) {
for (int v : arr) System.out.print(v + " ");
System.out.println();
}
}
初始:[5, 3, 8, 4, 2]
第1輪:比較交換 → [3, 5, 4, 2, 8] (8 冒泡到末端)
第2輪: → [3, 4, 2, 5, 8] (5 定位)
第3輪: → [3, 2, 4, 5, 8] (4 定位)
第4輪: → [2, 3, 4, 5, 8] (3 定位)
完成:[2, 3, 4, 5, 8]
| 指標 | 數值 | 說明 |
|---|---|---|
| 最佳時間複雜度 | O(n) | 僅需 1 輪發現無交換(需加旗標優化) |
| 平均時間複雜度 | O(n²) | 約 n²/4 次比較與交換 |
| 最壞時間複雜度 | O(n²) | 逆序陣列,每輪皆需完整交換 |
| 空間複雜度 | O(1) | 原地排序,僅需常數額外空間 |
| 穩定性 | 穩定 | 相等元素不交換,相對順序不變 |
break 跳出外層迴圈。j < n-1-i)、優化旗標、複雜度分析、穩定性證明。Arrays.sort() 採用雙軸快排 + TimSort 混合策略,效能碾壓 O(n²) 算法。冒泡排序是演算法入門的經典切入點,透過「比較-交換-邊界縮減」核心模式,建立對排序基本操作的直觀理解。掌握其優化思路(旗標、邊界記錄)有助於理解插入排序、快速排序等進階算法的改進邏輯。