堆排序通常基于二叉堆 实现,以大根堆为例,堆排序的实现过程分为两个子过程。第一步为取出大根堆的根节点(当前堆的最大值), 由于取走了一个节点,故需要对余下的元素重新建堆。重新建堆后继续取根节点,循环直至取完所有节点,此时数组已经有序。基本思想就是这样,不过实现上还是有些小技巧的。
以大根堆为例,堆的常用操作如下。
其中步骤1是给步骤2和3用的。
—PS:
1、初始数据
2、依据父节点大于等于所有子节点,创建大根堆完成后为
3、然后按照前序(pre-order):先根后左再右,将值取出
4、这时候数组的第一位就是最大值,与最末尾交换后,最大值就到了末尾,定死后去除节点
5、然后重复2->3->4
这次看这个算法是有吃力的,先知道个概念吧。看不明白的时候就去查些资料,会推荐些大佬的文章: