这里只谈理论不谈具体代码实现
堆排序是一种选择排序,关键是筛选。进行堆排序要先了解怎么建立堆在了解堆调整。堆又分为大根堆和小根堆,这里以小根堆为例。小根堆的每一个节点都要小于它的两个左右子树的根节点。
建立堆:先按照所给序列(从上到下从左到右)进行初始化成一个二叉树,然后从最后一个非叶子结点开始调整
- 调整从第n/2个元素开始,将以该元素为根的二叉树调整为堆
- 将以序号为n/2-1的节点为根的二叉树调整为堆
- 再将以序号为n/2-2的节点为根的二叉树调整为根
- 再以序号为n/2-3的节点为根的二叉树调整为堆
- …
*(这里最后一步应该是n/2-1) *
堆调整: - 输出堆顶元素之后,以堆中最后一个元素替代之;
- 然后将根 节点值与左右子树的根节点进行比较,并与其中小者进行交换
- 重复上述操作,直至叶子结点,将新得到的对,称这个对顶至叶子的调整过程称为筛选。大根堆思路一样
这样一步一步就完成了排序!