第一种(父节点比左右儿子小,但是左右儿子之间大小无法保证):
#include <bits/stdc++.h>
using namespace std;
int h[10010],cnt;
void create(int x)
{
h[++cnt]=x;
int t=cnt;
while(t>1&&h[t/2]>h[t])
{
swap(h[t],h[t/2]);
t/=2;
}
h[t]=x;
}
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
int x;
cin>>x;
create(x);
}
for(int i=1; i<=n; i++)
printf("%d ",h[i]);
return 0;
}
第二种(父节点比左右儿子小,同时左右儿子的大小可以保证,左儿子<=右儿子):
#include <bits/stdc++.h>
using namespace std;
int h[10010],cnt,n;
void down(int u)
{
int t=u;
if(h[u*2]<h[t]&&u*2<=n)
t=u*2;
if(h[u*2+1]<h[t]&&u*2+1<=n)
t=u*2+1;
if(t!=u)
{
swap(h[u],h[t]);
down(t);
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>h[i];
for(int i=n/2; i; i--)
down(i);
for(int i=1; i<=n; i++)
printf("%d ",h[i]);
return 0;
}
总结:两种方法都能建出来小顶堆,但是并不完全相同,第一种无法保证左右儿子之间的关系,但是第二种可以保证。这两种方法建堆,虽然都是小顶堆,但是也并不完全相同,需要题目做出选择。