public static void bubbleSort(int[] a) {
int n = a.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) swap(a, j, j + 1);
}
}
}
private static void swap(int[] a, int i, int j) {
int t = a[i]; a[i] = a[j]; a[j] = t;
}
public static void bubbleSortOptimized(int[] a) {
int n = a.length;
for (int i = 0; i < n - 1; i++) {
boolean swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) { swap(a, j, j + 1); swapped = true; }
}
if (!swapped) break; // 本輪無交換,已有序
}
}
public static void bubbleSortAdvanced(int[] a) {
int n = a.length;
int lastSwap = n - 1;
while (lastSwap > 0) {
int currentSwap = 0;
for (int j = 0; j < lastSwap; j++) {
if (a[j] > a[j + 1]) { swap(a, j, j + 1); currentSwap = j; }
}
lastSwap = currentSwap; // 之後區段已有序
}
}
| 版本 | 最好 | 平均 | 最壞 | 空間 | 穩定 |
|---|---|---|---|---|---|
| 基本 | O(n²) | O(n²) | O(n²) | O(1) | ✓ |
| 旗標優化 | O(n) | O(n²) | O(n²) | O(1) | ✓ |
| 記錄位置 | O(n) | O(n²) | O(n²) | O(1) | ✓ |
冒泡排序僅適合教學示意,實務專案嚴禁用於大量資料。
生產環境請直接使用Arrays.sort()(雙軸快排/TimSort)或Collections.sort()。
public static void main(String[] args) {
int[] data = {4, 2, 1, 8, 9, 4, 2};
bubbleSortOptimized(data);
System.out.println(Arrays.toString(data)); // [1, 2, 2, 4, 4, 8, 9]
}