一、简单了解堆
如果有一个关键码的集合k = {k0,k1,k2,...,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:ki <= k21+1 且 ki <= k2i+2(ki >= k2i+1 且 ki >= k2i+2) i = 0,1,2...,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。
堆的性质:
·堆中某个节点的值总是不大于或不小于其父节点的值;
·堆总是一棵完全二叉树。
二、堆的实现
具体实现:
1.堆的向下调整:将堆变成小堆或大堆(前提:调整的树左右子树必须是一个堆,才能调整)
2.对的创建:从倒数第一个非叶子节点的子树开始调整,一直调整到节点的树,就可以调整成堆。
3.堆的插入:先插入一个值到数组的尾上,再进行向上调整的算法,直到满足堆。
4.堆的删除:删除堆是删除堆顶的数据,将堆顶的数据和最后一个数据一换,然后删除数组最后一数据,再进行向下调整算法。
5.堆排序:结合了建堆和向下调整,先建堆然后将堆顶元素和数组最后一个元素交换,再将堆顶元素进行向下调整,直到排好序。
三、代码实现
#pragma