第 i 輪在 [i, n-1] 中找到最小元素索引 min,與 i 位置交換。共需 n-1 輪。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void swap(int *a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void SelectSort(int *a, int n) {
int i, j, min;
for (i = 0; i < n - 1; i++) {
min = i; // 假設當前位置最小
for (j = i + 1; j < n; j++) {
if (a[j] < a[min]) {
min = j; // 更新最小元素索引
}
}
if (min != i) { // 找到更小元素才交換
swap(a, i, min);
}
}
}
int main() {
int i = 0;
int a[13] = {5, 4, 9, 8, 7, 6, 3, 0, 1, 2, 15, 24, 100};
SelectSort(a, 13);
for (; i < 13; i++) {
printf("%d ", a[i]);
}
printf("\n");
system("pause");
return 0;
}
初始:[5,4,9,8,7,6,3,0,1,2,15,24,100]
i=0: 找最小 0(索引7) ↔ 5 → [0,4,9,8,7,6,3,5,1,2,15,24,100]
i=1: 找最小 1(索引8) ↔ 4 → [0,1,9,8,7,6,3,5,4,2,15,24,100]
i=2: 找最小 2(索引9) ↔ 9 → [0,1,2,8,7,6,3,5,4,9,15,24,100]
...
最終:[0,1,2,3,4,5,6,7,8,9,15,24,100]
| 指標 | 值 | 說明 |
|---|---|---|
| 時間複雜度 | O(n²) | 最好/最差/平均同階,無提前終止機制 |
| 空間複雜度 | O(1) | 原地排序 |
| 穩定性 | 不穩定 | 交換可能改變相等元素相對序 |
| 交換次數 | O(n) | 每輪最多 1 次,比冒泡少 |
| 特性 | 選擇排序 | 冒泡排序(優化版) |
|---|---|---|
| 比較次數 | 固定 n(n-1)/2 | 最好 n-1,最差 n(n-1)/2 |
| 交換次數 | ≤ n-1 | 最好 0,最差 n(n-1)/2 |
| 適應性 | 無(不利用有序度) | 有(標誌位提前終止) |
| 穩定性 | 不穩定 | 穩定 |
本文整理自「年少輕狂」博客,原文地址:https://shpshao.blog.51cto.com/1931202/1297434