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

排序 · 单步演示

插入排序

把数组分成左边有序、右边待处理两段。每次从右边拿一个数,在左边从后往前找位置,比它大的都往右挪一格,再把它放进空出来的位置。

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

380
121
712
53
444
265
906
177

当前操作已就位

步 001 / 047初始数组。左边第一个数单独看是有序的,之后把每个数插进左边的有序段。

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

伪代码 · 当前行高亮

  1. for i ← 1 … n−1
  2. key ← a[i];j ← i−1
  3. while j ≥ 0 且 a[j] > key
  4. a[j+1] ← a[j];j ← j−1
  5. a[j+1] ← key
  6. 结束

变量

比较次数0
交换/写入次数0

复杂度

最好情况O(n)
平均情况O(n²)
最坏情况O(n²)
额外空间O(1)
稳定性稳定

输入已经有序时,每个 key 只比较一次就停下,总共 n−1 次比较。输入完全逆序时,第 i 个数要挪 i 次,总共约 n²/2 次。

要点

  • 挪动次数等于逆序对个数:数据「基本有序」时它非常快。
  • 很多语言的标准库在子数组很短时会改用插入排序,因为常数小。
  • 条件写成 a[j] > key(严格大于),相等时不越过,所以稳定。

常见错误

把条件写成 a[j] ≥ key 仍能排对,但相等元素会被挪到前面,排序就不稳定了。

同一类的其他演示