nt
二叉堆可以近似的看做一完全二叉树,树中节点对应数组中的一个元素,我们将数组第二位置(取第二位置为了方便取其孩子节点 ,也就是数组中第一个元素)作为根节点,对于二叉最大堆,其中任意父节点的值大于等于孩子节点的值。可以利用这个性质,确定序 列最大值的位置。 整个程序两个模块分别为:1>建立堆 2>维护堆。维护堆,取决于二叉堆的高度所以时间复杂度为O(lgn),而建立堆我们需要 对堆中的一半节点进行维护堆的过程,时间复杂度为O(n), 所以整个程序的时间复杂度为O(nlgn)。int buildHeap(int *ar,int heapsize) //建立最大维护堆int swap(int *a,int *b) //交换<span style="font-family:KaiTi_GB2312;">两元素位置</span> int Left(int i); <span style="font-family:KaiTi_GB2312;">//左孩子数组下标(2*i)</span> <span style="font-family:KaiTi_GB2312;">int Right(int i); //又孩子数组下标 (2*i+1) int heapHealth(int *ar,int heapsize,int i) //Health=维护 hipsize堆元素个数 { int l; int r; int max; l=Left(i); r=Right(i); if(l<=heapsize&&ar[l]>ar[i]) //判断父亲节点与孩子节点的大小 max=l; else max=i if(r<=heapsize&&ar[r]>ar[max]) max=r; if(i!=max) //当孩子节点大于父节点,交换位置 { swap(&ar[i],&ar[max]); heapHealth(ar,heapsize,max); //对交换过得孩子节点递归维护操作 } } </span>
{
int i;
for(i=heapsize/2,i>0,i--)
heapHealth(ar,heapsize,max) ;
}
int heapSort(int *ar,int heapsize)
{
int i;
buildHeap(ar,heapsize); //建立最大堆,堆顶元素为序列最大值
for(i=heapsize;i>1;i--)
{
swap(ar[1],ar[heapsize]); //将最大值交换到序列最后,实现升序排列
heapsize--;
heapHealth(ar,heapsize,1); //对除去最后元素的最大堆,进行维护。
}
}