每輪從未排序區選最小元素換到有序區末尾,時間複雜度 O(n²),不穩定。
public class SelectionSort {
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIdx]) minIdx = j;
}
if (minIdx != i) {
int tmp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = tmp;
}
}
}
}
相鄰元素兩兩比較,大者後移,每輪將最大元素「冒泡」到末尾,可優化加旗標提前終止。
public class BubbleSort {
public static void sort(int[] arr) {
boolean swapped;
for (int i = 0; i < arr.length - 1; i++) {
swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp;
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,已有序
}
}
}
| 算法 | 最好 | 平均 | 最壞 | 空間 | 穩定性 |
|---|---|---|---|---|---|
| 選擇排序 | O(n²) | O(n²) | O(n²) | O(1) | 不穩定 |
| 冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 穩定 |
教學階段理解原理即可,生產環境請直接使用 Arrays.sort() (雙軸快排/TimSort)。