算法导论 堆排序 C语言实现

算法导论 第六章 堆排序 c语言
按照书上的顺序来

i是下标,由于C语言里下标从0开始与书上有些不同,这样就可以算出下标为I的元素的父元素和左右子元素的下标

<span style="font-size:14px;">int PARENT (int i)
{
	return (i-1)/2;
}
int LEFT (int i)
{
    return ((i+1)<<1)-1;
}
int RIGHT (int i)
{
    return (i+1)<<1;
<span style="font-family:Microsoft YaHei;font-size:18px;">}</span></span><span style="font-family:Microsoft YaHei;font-size:18px;">
</span>
下面是维护最大堆性质的函数 ,I 是下标
</pre><pre name="code" class="cpp"><span style="font-size:18px;">void MAX_HEAPIFY (int A[],int i,int length)
{
  int r,l,largest;
  r=RIGHT(i);
  l=LEFR(i);
  if(r < length && A[r]>A[i])
      largest=r;
  else
      largest=i;
  if(l < length && A[l]>A[largest])
      largest=l;                                //找个三个元素中值最大元素的下标
  if(largest != i)
  {
     swap(&A[i],&A[largest]);                   //把大的换到上面去,并且因为交换了元素,下面的元素可能不满足最大堆,所以要对largest元素递归要用
     MAX_HEAPIFY(A,largest,length);           
  }
}</span>
建堆,就是对所有有子节点的元素分别调用 MAX_HEAPIFY
有子节点的元素是 (length/2)-1 to 0

</pre><pre name="code" class="html"><span style="font-size:18px;">void BUILD-MAX-HEAP(int A[],int length)
{
   int i;
   for(i = (length/2)-1 ;i >= 0; i--)
     MAX_HEAPIFY(A,i,length);
}</span>
最后就是排序了,调用BUILD-MAX-HEAP建造最大堆,所以只要把堆最上面的元素拿出来就OK;
<span style="font-size:18px;">void HEAPSORT (int A[],int length)
{
   BUILD-MAX_HEAP(A,length);
   int i;
   for(i=length-1;i>=1;i--)
   {
      swap(&A[0],&A[i]);
      MAX_HEAPIFY(A,0,i-1);
   }
}</span>

有点不懂书里面的heap-size是
干什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值