冒泡排序是最基礎的交換排序算法。其形象比喻:較小的關鍵字如氣泡逐步上浮,較大的關鍵字如石塊下沉。每一輪遍歷都會將當前無序區間的最大值「沉底」到正確位置。
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間複雜度 | O(n²) | 最好/最壞/平均均為平方級 |
| 空間複雜度 | O(1) | 原地排序,僅需常數額外空間 |
| 穩定性 | 穩定 | 相等元素相對順序不變 |
public static <T extends Comparable<T>> void bubbleSort(T[] array) {
int n = array.length;
for (int i = n - 1; i >= 1; i--) { // 控制輪數,每輪確定一個最大值
for (int j = 0; j < i; j++) { // 無序區間遍歷
if (array[j].compareTo(array[j + 1]) > 0) {
T temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
public static void bubbleSort(int[] array) {
int n = array.length;
boolean swapped;
for (int i = n - 1; i > 0; i--) {
swapped = false;
for (int j = 0; j < i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 提前終止優化:本輪無交換說明已有序
}
}
public static void main(String[] args) {
int[] data = {5, 6, 8, 4, 2, 4, 9, 0};
System.out.println("排序前: " + Arrays.toString(data));
bubbleSort(data);
System.out.println("排序後: " + Arrays.toString(data));
// 輸出: [0, 2, 4, 4, 5, 6, 8, 9]
}
swapped 標誌,最好情況 O(n) 線性時間完成冒泡排序雖非生產環境主流選擇,但作為「排序算法入門磚」,其思想精髓——相鄰比較交換、有序區間逐步擴展——貫穿於快速排序、希爾排序等進階算法中。熟練掌握其變體與優化,是演算法功力的重要標誌。