以下實現針對 int[],原地排序,返回同一陣列引用。實際開發請優先使用 Arrays.sort() (雙軸快排/TimSort,O(n log n)、穩定)。
public static int[] bubbleSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
swapped = true;
}
}
if (!swapped) break; // 已有序提前結束
}
return a;
}
O(n) (已有序),平均/最差 O(n²)。比較次數固約 n(n-1)/2。O(1)。public static int[] selectionSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[minIdx]) minIdx = j;
}
if (minIdx != i) {
int tmp = a[i];
a[i] = a[minIdx];
a[minIdx] = tmp;
}
}
return a;
}
O(n²),與輸入無關。比較 n(n-1)/2,交換最多 n-1 次。O(1)。public static int[] insertionSort(int[] a) {
for (int i = 1; i < a.length; i++) {
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
return a;
}
O(n) (已有序),平均/最差 O(n²) (逆序)。O(1)。Arrays.sort() 閾值 47)。| 算法 | 最好 | 平均 | 最差 | 空間 | 穩定 | 備註 |
|---|---|---|---|---|---|---|
| 冒泡 | O(n) | O(n²) | O(n²) | O(1) | ✓ | 教學用,實戰罕用 |
| 選擇 | O(n²) | O(n²) | O(n²) | O(1) | ✗ | 交換次數少 |
| 插入 | O(n) | O(n²) | O(n²) | O(1) | ✓ | 小數據/近有序首選 |
| 快排 | O(n log n) | O(n log n) | O(n²) | O(log n) | ✗ | 通用首選 |
| 歸併 | O(n log n) | O(n log n) | O(n log n) | O(n) | ✓ | 穩定、外部排序 |
| 堆排 | O(n log n) | O(n log n) | O(n log n) | O(1) | ✗ | 原地、保證 O(n log n) |
Arrays.sort() 基本類型用雙軸快排,對象用 TimSort (歸併+插入混合)。Arrays.parallelSort() (JDK 8+) 利用 Fork/Join 多核加速。Comparator 或 Comparable。