重複遍歷陣列,比較相鄰元素,順序錯誤則交換。每輪將最大元素「沉」到末端(或最小元素「浮」到前端),故名冒泡排序。
陣列 [3, 5, 2, 6, 2]:
[3, 2, 5, 2, 6] (6 就位)[2, 3, 2, 5, 6] (5 就位)[2, 2, 3, 5, 6] (3 就位)[2, 2, 3, 5, 6] (完成)public class BubbleSort {
public static int[] sort(int[] array) {
if (array == null || array.length <= 1) return array;
for (int i = 0; i < array.length - 1; i++) {
System.out.println("第 " + (i+1) + " 輪開始");
boolean swapped = false;
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j+1] < array[j]) {
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
swapped = true;
}
System.out.println(" 第 " + (j+1) + " 次比較: " + Arrays.toString(array));
}
System.out.println(" 結果: " + Arrays.toString(array));
if (!swapped) break; // 優化:提前結束
}
return array;
}
public static void main(String[] args) {
int[] data = {3, 5, 2, 6, 2};
System.out.println("原始: " + Arrays.toString(data));
sort(data);
System.out.println("最終: " + Arrays.toString(data));
}
}
原始: [3, 5, 2, 6, 2]
第 1 輪開始
第 1 次比較: [3, 5, 2, 6, 2]
第 2 次比較: [3, 2, 5, 6, 2]
第 3 次比較: [3, 2, 5, 6, 2]
第 4 次比較: [3, 2, 5, 2, 6]
結果: [3, 2, 5, 2, 6]
第 2 輪開始
第 1 次比較: [2, 3, 5, 2, 6]
第 2 次比較: [2, 3, 5, 2, 6]
第 3 次比較: [2, 3, 2, 5, 6]
結果: [2, 3, 2, 5, 6]
第 3 輪開始
第 1 次比較: [2, 3, 2, 5, 6]
第 2 次比較: [2, 2, 3, 5, 6]
結果: [2, 2, 3, 5, 6]
第 4 輪開始
第 1 次比較: [2, 2, 3, 5, 6]
結果: [2, 2, 3, 5, 6]
最終: [2, 2, 3, 5, 6]
| 指標 | 數值 |
|---|---|
| 時間複雜度(最好) | O(n) — 已排序陣列,單輪無交換即結束 |
| 時間複雜度(平均/最差) | O(n²) |
| 空間複雜度 | O(1) — 原地排序 |
| 穩定性 | 穩定 — 相等元素不交換 |
冒泡排序雖非實務首選,但其「相鄰比較交換、輪次遞減、提前結束」的思維模式是理解更複雜排序演算法的基石。掌握雙重迴圈邊界條件、穩定性分析與優化技巧,能夠在面試與教學場合游刃有餘。