堆排序

nt
     二叉堆可以近似的看做一完全二叉树,树中节点对应数组中的一个元素,我们将数组第二位置(取第二位置为了方便取其孩子节点
,也就是数组中第一个元素)作为根节点,对于二叉最大堆,其中任意父节点的值大于等于孩子节点的值。可以利用这个性质,确定序
列最大值的位置。

     整个程序两个模块分别为:1>建立堆  2>维护堆。维护堆,取决于二叉堆的高度所以时间复杂度为O(lgn),而建立堆我们需要
对堆中的一半节点进行维护堆的过程,时间复杂度为O(n), 所以整个程序的时间复杂度为O(nlgn)。
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 buildHeap(int *ar,int heapsize) //建立最大维护堆
{
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); //对除去最后元素的最大堆,进行维护。
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值