#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
int num[1000000];
void heapup(int m)
{
int tmp=num[m];
int j=(m-1)/2;
while(j>=0&&m!=0)
{
if(num[j]<=tmp)
break;
num[m]=num[j];
m=j;
j=(m-1)/2;
}
num[m]=tmp;
}
void heapadd(int n,int shu)
{
num[n]=shu;
heapup(n);
}
//=========以上是插入==========//
void heapdown(int m,int lon)
{
int tmp=num[m];
int j=2*m+1;
while(j<lon)
{
if(j+1<lon&&num[j+1]<num[j])
++j;
if(num[j]>=tmp)
break;
num[m]=num[j];
m=j;
j=2*m+1;
}
num[m]=tmp;
}
//==========以上是删除==========//
void buildheap(int n)
{
for(int i=n/2-1;i>=0;--i)
heapdown(i,n);
}
void heapsort()
{
buildheap(n);
for(int i=n-1;i>=1;--i)
{
swap(num[0],num[i]);
heapdown(0,i-1);
}
}
//==========以上是排序========//
int main()
{
cin>>n;
for(int i=0;i<n;++i)
{
int shu;
cin>>shu;
heapadd(i,shu);
}
heapsort();
for(int i=0;i<n;++i)
cout<<num[i]<<" ";
return 0;
}
【kuandui】二叉堆
最新推荐文章于 2019-04-04 15:26:01 发布
恩,虽然二叉堆编的我头疼,但......所以我还是决定讲少点。
二叉堆是什么呢?其实就是一个数组......以前我们学过胜者树,这东西和胜者树差不多,只是少了最下面一层,然后求最大最小值时用交换罢了。
就像:
好吧我承认画工捉急,能看懂就行。就是这样的。
那么我们如何取出一个值呢?
我们可以把要取出的这个值与最后一个值交换,然后维护一下二叉堆!
such so easy!
【实例】
二叉堆排序。
【例程】