Developer Toolbox

堆排序

先把列表整理成堆,也就是每个父节点都比子节点大的树。然后反复把最大值移到末尾。

  • Ω(n log n)
  • Θ(n log n)
  • O(n log n)
  • O(1)
  • 否
  • 是
  • 比较中
  • 移动中
  • 已就位
0 / 299 步
比较次数 交换次数

点击播放,线条会显示排序过程中代价如何增长

点击播放,或一步一步查看。

空格键:播放或暂停。左右方向键:单步移动。Home 和 End 键:跳转。

试试看: 选一个逆序的列表。建堆几乎不需要交换,之后每一轮都把最大值移到末尾。

工作原理

堆就存放在列表里:位置 i 上的值,它的子节点在位置 2i+1 和 2i+2,最大值总在最前面。把它交换到末尾,让堆缩小一格,再修复堆。排好的部分从右边逐渐变长。

适用场合

适合最坏情况下也要保持快速、又不能用额外内存的场合,比如小型设备。平均来说它比快速排序慢,所以常被当作保底方案。