先说说堆
堆分为大根堆和小根堆,都是完全二叉树。
大根堆:要求每个节点不大于其父节点
小根堆 : 要求每个节点不小于其父节点
复习一下完全二叉树:
- 除了最后一层外,其他各层都达到该层节点的最大数,最后一层如果不满,该层所有节点都全部靠左排
- 一颗二叉树,深度为k,对这棵树编号,如果所有的编号都和满二叉树的编号对应,则这棵树是完全二叉树
堆排序思想
堆排序的话,最重要还是建立堆,然后调整堆,使得堆满足大根堆(或小根堆)的定义。
我们定义了一个维护堆的方法percDown,这个方法维护最大堆的性质。
建立堆的过程其实是生成了一个数组,这个数组满足最大堆,但是这个数组不满足非降序的顺序。所以我们要把最大的元素一个一个提取,然后提取一个进行一次堆调整
最后生成出来的数组就是排序好的
堆排序的实现
堆排序先建堆,也就是将输入数组A[1..N]建成最大堆,注意这里下标是1开始,A[0]我们是用来作为一个哨兵使用。
首先其实是一个建堆过程,这个过程我们让i从A.length/2开始,
因为一个堆有一半的节点都是叶节点,而且一般都是存到数组的后半部分。
所以我们的i从一半长度开始即可。
如图: