简单选择排序将数组分为已排序和未排序两部分,每趟从未排序部分中选出最小元素,与未排序部分的第一个元素交换。
核心思想:每趟确定一个最小元素的最终位置,共 $n-1$ 趟。
| 项目 | 值 |
|---|---|
| 最好时间 | $O(n^2)$ |
| 最坏时间 | $O(n^2)$ |
| 平均时间 | $O(n^2)$ |
| 空间 | $O(1)$ |
| 稳定性 | ❌ 不稳定 |
| 比较次数 | 与初始序列无关,始终 $\frac{n(n-1)}{2}$ |
| 交换次数 | 最多 $n-1$ 次 |
void SelectSort(int A[], int n) {
int i, j, min;
for (i = 1; i < n; i++) { // 共 n-1 趟
min = i;
for (j = i+1; j <= n; j++) // 在未排序部分找最小
if (A[j] < A[min]) min = j;
if (min != i) swap(A[i], A[min]);
}
}
对 49, 38, 65, 97, 76, 13, 27, 49* 排序:
初始: 49 38 65 97 76 13 27 49*
第1趟: 找到最小13,与49交换
[13] 38 65 97 76 49 27 49*
第2趟: 在38,65,97,76,49,27,49*中找最小27,与38交换
[13 27] 65 97 76 49 38 49*
第3趟: 最小38,与65交换
[13 27 38] 97 76 49 65 49*
第4趟: 最小49,与97交换
[13 27 38 49] 76 97 65 49*
第5趟: 最小49*,与76交换
[13 27 38 49 49*] 97 65 76
第6趟: 最小65,与97交换
[13 27 38 49 49* 65] 76 97
第7趟: 最小76,已在正确位置
[13 27 38 49 49* 65 76 97]
| 性质 | 说明 |
|---|---|
| 比较次数 | 始终 $\frac{n(n-1)}{2}$,与初始序列无关 |
| 交换次数 | 最多 $n-1$ 次 |
| 时间 | $O(n^2)$(最好 / 平均 / 最坏) |
| 空间 | $O(1)$ |
| 稳定性 | ❌ 不稳定 |
例:[5, 5*, 3]:第 1 趟找到最小 3,与第 1 个 5 交换 → [3, 5*, 5],5 和 5* 的相对位置改变了。
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。