選擇排序 每輪從未排序區間選出最小(或最大)元素,與區間首位交換。第 i 輪處理 arr[i...n-1],共需 n-1 輪。
陣列:[5, 2, 8, 4, 9, 1]
[1, 2, 8, 4, 9, 5][1, 2, 8, 4, 9, 5][1, 2, 4, 8, 9, 5][1, 2, 4, 5, 9, 8][1, 2, 4, 5, 8, 9]public class SelectionSort {
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) minIdx = j;
}
if (minIdx != i) swap(arr, i, minIdx); // 僅在必要時交換
}
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
| 指標 | 數值 | 說明 |
|---|---|---|
| 比較次數 | n(n-1)/2 | 與輸入資料無關,固定 |
| 交換次數 | 0 ~ n-1 | 最好 0(已有序),最壞 n-1(逆序) |
| 時間複雜度 | O(n²) | 最好/最壞/平均皆同 |
| 空間複雜度 | O(1) | 原地排序 |
| 穩定性 | 不穩定 | 交換可能改變相等元素相對順序 |
利用二元堆結構將「選出最小值」從 O(n) 降為 O(log n),整體時間複雜度達 O(n log n),是選擇排序的高效進化版。