排序 · 单步演示
选择排序
每一轮在还没排好的部分里找出最小值,和这一段最前面的数交换。n−1 轮之后整体有序。
当前操作已就位
步 001 / 044初始数组。每一轮在未排序部分里找最小值,放到这一段的最前面。
键盘:← → 单步,空格 播放/暂停(先点一下演示区)。
伪代码 · 当前行高亮
for i ← 0 … n−2min ← ifor j ← i+1 … n−1if a[j] < a[min]:min ← jif min ≠ i:交换 a[i]、a[min]结束
变量
| 比较次数 | 0 |
|---|---|
| 交换/写入次数 | 0 |
复杂度
| 最好情况 | O(n²) |
|---|---|
| 平均情况 | O(n²) |
| 最坏情况 | O(n²) |
| 额外空间 | O(1) |
| 稳定性 | 不稳定 |
不管输入什么样,比较次数都是 n(n−1)/2;交换最多 n−1 次,是简单排序里交换最少的。
要点
- 比较次数与输入无关,所以最好、最坏都是 O(n²)。
- 交换次数最多 n−1 次,适合「写一次很贵」的场合。
- 远距离交换会打乱相等元素的次序,例如 [5, 5, 2] 第一轮就把前一个 5 换到了最后。
常见错误
常被误认为稳定。用 [5, 5, 2] 在演示里走一遍,看两个 5 的前后次序就明白了。