码迷,mamicode.com
首页 > 其他好文 > 详细

大根堆

时间:2017-07-24 23:42:52      阅读:523      评论:0      收藏:0      [点我收藏+]

标签:一点   api   pre   amp   out   最大的   style   cin   最大   

2017-07-24 22:04:08

writer:pprp

参考书目:张新华的《算法竞赛宝典》

思路跟小根堆一个样,主要的思路是先构造一个大根堆,然后在每次将最大的一个排除出来,再进行堆排序

代码如下:

#include <iostream>

using namespace std;

const int maxn = 100;
int a[maxn],n,heapsize;

void maxheapify(int i)     //根据数组的下表对应节点,对其左右两个子节点进行堆构造;
{
      int l,r,largest,t;
      l = i<<1;
      r = (i<<1)+1;
      if(l<=heapsize && a[i]<a[l])
            largest = l;
      else
            largest = i;
      if(r<=heapsize && a[r]>a[largest])
            largest = r;
      if(largest!=i)
      {
            t = a[i];
            a[i] = a[largest];
            a[largest] = t;
            maxheapify(largest);
      }
      return;
}

void BuildMaxHeap()    //建堆
{
      heapsize = n; //用在heapsort函数中,记录一下n的值;
      for(int i = n/2;i >= 1; i--)
            maxheapify(i);
      return;      
}

void heapsort()
{
      int i,t;
      BuildMaxHeap();
      for(i = n;i >= 2;i--)
      {
            t = a[1];
            a[1] = a[i];
            a[i] = t;
            heapsize--;
            maxheapify(1);
      }
}

int main()
{
      int i;
      cin >> n;
      for(i = 1; i <= n;i++)
            cin >>a[i];
            
      heapsort();  //建堆主函数
      
      for(i = 1;i <= n;i++)
      {
            cout << a[i] << endl;
      }
    return 0;
}

我大部分都是按照书上写的来敲的,所以如果单纯让我写还是有一点困难,之后我得再写一遍。

大根堆

标签:一点   api   pre   amp   out   最大的   style   cin   最大   

原文地址:http://www.cnblogs.com/ilovelianghui/p/7231419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!