#include<cstdio>
#include<algorithm>
using namespace std;
int n,heap[10000000];
void swap(int *A,int a,int b)
{
int temp=A[a]; A[a]=heap[b]; A[b]=temp;
}
void Heapify(int n,int t)//对根为t的堆维持堆的基本性质
{
int left=t*2;
int right=t*2+1;
int maxn=t;//先令最大值在t处
if (left<=n)
maxn=heap[left]>heap[maxn]?left:maxn;
if (right<=n)
maxn=heap[right]>heap[maxn]?right:maxn;
if (maxn!=t)
{
swap(heap,maxn,t);
Heapify(n,maxn);
}
}
void Insert(int n,int t)
{
heap[++n]=t;
int p=n;
while (p>1&&heap[p]>heap[p/2])
{
heap[p]=heap[p/2];
p/=2;
}
heap[p]=t;
}
int main()
{
make_heap(*a,*b);
scanf("%d",&n);
for (int i=1; i<=n; i++)
scanf("%d",&heap[i]);
for (int i=n/2; i>=1; i--)//Build_Heap
Heapify(n,i);
for (int i=n; i>=2; i--)
{
swap(heap,1,i);
Heapify(i-1,1);
}
for (int i=1; i<=n; i++)
printf("%d ",heap[i]);
return 0;
}
【模板】手写堆
最新推荐文章于 2024-04-16 22:26:12 发布