
每輪將最大元素「冒泡」到末尾,已排序區間從右向左擴展。
public class BubbleSort {
// 標準版
public static void sortBasic(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) swap(arr, j, j + 1);
}
}
}
// 優化版:提前終止標誌
public static void sortOptimized(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,已有序
printRound(arr, i + 1);
}
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
private static void printRound(int[] arr, int round) {
System.out.print("第 " + round + " 輪: ");
for (int v : arr) System.out.print(v + "\t");
System.out.println();
}
public static void main(String[] args) {
int[] data = {67, 69, 75, 87, 89, 90, 99, 100};
System.out.println("原始: " + Arrays.toString(data));
sortOptimized(data);
System.out.println("結果: " + Arrays.toString(data));
}
}
原始: [67, 69, 75, 87, 89, 90, 99, 100]
第 1 輪: 67 69 75 87 89 90 99 100
第 2 輪: 67 69 75 87 89 90 99 100
... (因已有序,第 1 輪後 swapped=false,直接 break)
結果: [67, 69, 75, 87, 89, 90, 99, 100]
| 指標 | 數值 |
|---|---|
| 最好時間複雜度 | O(n) (優化版,已有序) |
| 平均/最壞時間複雜度 | O(n²) |
| 空間複雜度 | O(1) 原地排序 |
| 穩定性 | 穩定 (相等元素不交換) |
Arrays.sort() (雙軸快排/TimSort),或 Collections.sort()。Comparable 或傳入 Comparator。