一些烂代码(自娱自乐)之堆

heap::heapify(int n)                  
 
{
   int l,r,largest;                             
   l=left(i)
   if(l<heapsize)
    if(a[i]<a[l])
     largest=l;
   r=right(i);
   if(r<heapsize)
    if(a[largest]<a[r])
     largest=r;
   int tmp=a[i];
   a[i]=a[largest];
   a[largest]=tmp;
   heapify(largest);             //仿算法导论写的递归维持堆性质的代码
}


void heapify(int* a,int n)
{
   int l=left(n),r=right(n);
   while(l<heapsize&&a[i]<a[l]||r<heapsize&&a[i]<a[r])
  {
      int largest=a[l]>a[r]?l:r;
      int tmp=a[i];
      a[i]=a[largest];
      a[largest]=tmp;
      i=largest;
      l=left(i);
     r=right(i);                   //用while循环消除尾递归的代码
   }
}

从数组构造堆

makeheap(int* a)
{
  int length=size(a);
  heapsize=length;
  for(int i=length/2;i>=0;i--)
 {
   heapify(a,i);
  }
 }               //从直觉上看时间复杂度为o(nlogn),但有数学家证出了实际复杂度为o(n) :)
     

 void heapsort(int *a)
{
   makeheap(a);
  for(int i=size(a)-1;i>=1;i++)
 {
    int tmp=a[i];
    a[i]=a[0];
    a[0]=a[i];
    heapsize=heapsize-1;
    heapify(a,0);
  }
}          //堆排序

int ExtractMax(int* a)
{
   if(heapsize<1)
   error("there is no instance");
   int result=a[0];
   a[0]=a[heapsize];
   heapsize--;
   heapify(a);
   return result;
}                     //提取堆最大的元素

 

 insert(int* a,int key)
{
   heapsize++;
   a[heapsize]=key;
   i=heapsize;
   while(i>=1&&a[parent(i)]<key){
     a[i]=a[parent(i)];
     i=parent(i);}
   a[i]=key
}            //消除尾递归

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值