每趟從無序區選出最小 (或最大) 元素,放入有序區末尾,直到全部排序完成。
初始:[49, 38, 65, 97, 76, 13, 27, 49]
第1趟: 13 移至位置 0 → [13, 38, 65, 97, 76, 49, 27, 49]
第2趟: 27 移至位置 1 → [13, 27, 65, 97, 76, 49, 38, 49]
第3趟: 38 移至位置 2 → [13, 27, 38, 97, 76, 49, 65, 49]
第4趟: 49 移至位置 3 → [13, 27, 38, 49, 76, 49, 65, 97]
第5趟: 49 移至位置 4 → [13, 27, 38, 49, 49, 97, 65, 76]
第6趟: 76 移至位置 5 → [13, 27, 38, 49, 49, 76, 97, 65]
第7趟: 76 移至位置 6 → [13, 27, 38, 49, 49, 76, 76, 97]
private static void SelectionSort(ref double[] array)
{
for (int i = 0; i < array.Length; i++)
{
double minVal = array[i];
int minIdx = i;
for (int j = i; j < array.Length; j++)
{
if (minVal > array[j])
{
minVal = array[j];
minIdx = j;
}
}
ExchangeValue(ref array[i], ref array[minIdx]);
}
}
private static void ExchangeValue(ref double a, ref double b)
{
double t = a; a = b; b = t;
}
| 指標 | 複雜度 |
|---|---|
| 時間 (最好/平均/最差) | O(n²) / O(n²) / O(n²) |
| 空間 | O(1) |
| 穩定性 | 不穩定 (交換可能改變相同值相對順序) |
| 交換次數 | 最多 n-1 次 (所有排序中最少) |