如题目>▽<
堆排序,顾名思义,是利用堆的特性来进行排序。本文讲述利用大顶堆来进行非递减排序,非递增排序同理。
调整堆(heapify)
将某一个节点进行heapify操作,使得该节点(父亲节点)的值大于两个儿子节点,我们要保证交换后的子节点仍然是一个堆,所以同样需要以这个子节点为父节点继续进行heapify操作,直到进行到堆的最底部
因为完全二叉树的特性,在知道某一个点的下标的情况下,我们可以轻易地算出其父节点及其子节点的下标
函数代码如下:
1 | void heapify(int tree[], int n, int i) { |
建立堆
对于一个乱序的数组,为了将其创建成一个堆,我们需要从最后一个父节点开始,层层向上进行heapify操作,这样我们就能保证所有的父节点均大于子节点,也就建立成了大顶堆
函数代码如下:
1 | void build_heap(int tree[], int n) { |
进入正戏!堆排序
现在我们已经建立出了大顶堆,我们此时可以将堆顶与堆底的最后一个元素交换。这样,我们就将最大的数排好序了。对于新交换来的点,为了继续维护大顶堆,我们仍需要进行heapify的操作,不过此时的n应该变为n-1(因为我们已经将最后的元素排好序了)。
函数代码如下:
1 | void heap_sort(int tree[], int n) { |