每次从未排序数组中选择最小的放到有序数组中
不怎么考
堆是特殊的完全二叉树
大根堆(大顶堆)👇,父节点比子节点大
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
87 | 45 | 78 | 32 | 17 | 65 | 53 | 09 |
小根堆(小顶堆)👇,父节点比子节点小
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
09 | 32 | 17 | 45 | 78 | 65 | 53 | 87 |
不稳定算法
时间复杂度:O(nlog2n)
基本思想
将无需序列构建成一个堆(完全二叉树)
将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端
重新调整结构使其满足堆定义,然后继续交换堆顶元素和末尾元素
反复执行调整和交换步骤,直到整个序列有序
取一堆数据中最大(最小)的k个元素时优先使用堆排序
堆排序的序列与相当于二叉树的层次序列
可以讲堆视作完全二叉树,采用顺序存储方式存放堆
插入和删除一个新元素的时间复杂度都为O(log2n)
构造n个记录的初始堆,时间复杂度为O(n)
常考
15
比较,符合定义不换位10
比较,不符合定义交换12
和10
16
比较,符合定义不换位