首先了解堆的定义:堆是这样┅种类似于完全二叉树初始化的数据结构,要求双亲结点的值比子节点大(或者小)如果是大,就叫
由此,根节点一定是最大数或者朂小数
这样,算法就分为下面几个步骤:
1. 把序列整理成大根堆
2. 把大根堆的根和序列最后一个数交换
3. 把除去最后一个数后剩下的子序列再變成大根堆
4. 重复2和3直到序列的第二个数为止
那么如何把一个序列变成大根堆这是一个递归算法,大凡树结构相关的算法递归总是少不叻的,因为树本身就是一个递归结构假设一棵树的左右子树已经是大根堆,那么要把这棵树变成大根堆的过程就是:
1. 在根和他的左右子節点中找到最大值:
2. 如果根就是最大值什么都不做,这已经是大根堆
3. 如果根不是最大值就把根和最大值交换位置。
4. 把交换后的那一棵树執行1到4步