堆排序浅析
来源于我的博客
堆排序
最大堆
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。
大根堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值,且要求是完全二叉树。
ps:这里指的堆均为二叉堆(Binary Heap),最小堆的定义类似
堆排序的核心就是建立堆与重建堆的过程:
建立堆
以数组[4 5 1 6 2 7 3 8]为例
排序
堆排序就是先建立最大堆,取出最大值后剩下的部分再重建堆,依次取出最大值即可。
而通常对数组排序时可以简化为:
1. 建立最大堆(将数组分为[大根堆+已排序]两部分)
2. 将最大值与堆最后一个叶结点交换,这个最大值并入后面已排序部分,对前面部分的数组重新堆化
3. 重复2直到堆只剩下一个元素,此时数组已经排序完成(小到大)