数据结构与算法演示台SUANFA.NET.CN · STEP BY STEP

排序 · 单步演示

选择排序

每一轮在还没排好的部分里找出最小值,和这一段最前面的数交换。n−1 轮之后整体有序。

1 到 16 个整数(−99 到 999),用逗号或空格隔开。 输入只在你的浏览器里计算,不会上传。

290
641
252
123
224
115
646
87

当前操作已就位

步 001 / 044初始数组。每一轮在未排序部分里找最小值,放到这一段的最前面。

键盘: 单步,空格 播放/暂停(先点一下演示区)。

伪代码 · 当前行高亮

  1. for i ← 0 … n−2
  2. min ← i
  3. for j ← i+1 … n−1
  4. if a[j] < a[min]:min ← j
  5. if min ≠ i:交换 a[i]、a[min]
  6. 结束

变量

比较次数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 的前后次序就明白了。

同一类的其他演示