c语言大顶堆函数,排序——堆排序-大根堆(大顶堆)

1.小根堆

若根节点存在左子女则根节点的值小于左子女的值;若根节点存在右子女则根节点的值小于右子女的值。

2.大根堆

若根节点存在左子女则根节点的值大于左子女的值;若根节点存在右子女则根节点的值大于右子女的值。

3.结论

(1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子)。

(2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值。

(3)堆适合于采用顺序存储。

4.堆的插入算法

将一个数据元素插入到堆中,使之依然成为一个堆。

算法描述:先将结点插入到堆的尾部,再将该结点逐层向上调整,直到依然构成一个堆,调整方法是看每个子树是否符合大(小)根堆的特点,不符合的话则调整叶子和根的位置。

5.堆的删除算法

堆在删除元素时,只可以删除根节点。

算法描述:将根节点删除后用堆尾结点进行填补,调整二叉树,使之依然成为一个堆。

6.堆排序(大根堆,小根堆类似)

其基本思想为(大根堆):

1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区,

构建的过程是每个非叶子结点都经过一次调整,调整顺序为从底层至顶层(调整过程中含有递归),这样调整下来这个二叉树整体上就是一个大根堆(或小根堆)了;

2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];

3)由于交换后新的堆顶R[1]

你可能感兴趣的:(c语言大顶堆函数)