这里的堆其实是一种采用顺序存储的数据结构
且采用树型的表现形式(完全二叉树),至于完全二叉树以什么样的形式存储在数组中,请参考数据结构相关的书籍。下面直接给出完全二叉树中父结点与左右孩子的关系。
int record[1000];//存储二叉树所有结点的数组
int root;//某子树的一根结点
int Lchild=2*root;//record数组中,root的左孩子所在下标
int Rchild=2*root+1//record数组中,root的左孩子所在下标
对于大顶堆,父结点的值大于孩子结点的值。小顶堆,父结点的值小与孩子结点的值。采用堆排序的时间复杂度为O(nlgn),且为原址排序。
维护大顶堆O(lgn)
//维护子树,使其保持大顶堆的性质。递归维护
void MAX_HEAPIFY(int *a, int root,int len)
{
int l=2*root;
int r=l+1;
int largest=root;
//选择父结点,左右孩子结点中,值最大的结点,并用largest记录下表编号
if(l<len&&a[l]>a[root])
largest=l;
if(