本文章主要目的是分享代码,不含堆知识的详细介绍
代码1
小根堆实现从小到到排序:
每次删除并输出(直接输出或存放于数组)顶部元素,
维护此时的小根堆,反复上行操作,直到堆为空为止
#include <bits/stdc++.h>
using namespace std;
int h[101],n;
void siftdown(int i)
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(h[i]>h[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(h[t]>h[i*2+1])
t=i*2+1;
}
if(t!=i)
{
int temp=h[t];
h[t]=h[i];
h[i]=temp;
i=t;
}
else
flag=1;
}
}
void creat()
{
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
int deletemax()
{
int t=h[1];
h[1]=h[n--];
siftdown(1);
return t;
}
int main()
{
//freopen("data.txt","r",stdin);
int i,num;
cin>>num;
for(int i=1;i<=num;i++)
cin>>h[i];
n=num;
creat();
for(int i=1;i<=num;i++)
cout<<deletemax()<<" ";
return 0;
}
代码2
大根堆实现从小到达排序:
最大堆建好以后,最大元素在h[1],将第一个元素h[1](最大元素)和最后一个元素h[n]交换,此时h[n]为数组最大元素。
此时堆大小减一,即n–,维护此时的大根堆,重复上行操作,直到n为0
#include <bits/stdc++.h>
using namespace std;
int h[101],n;
void swap(int x,int y)
{
int temp=h[x];
h[x]=h[y];
h[y]=temp;
}
void siftdown(int i)
{
int flag=0,t;
while(2*i<=n&&flag==0)
{
if(h[i]<h[i*2])
t=2*i;
else
t=i;
if(2*i+1<=n)
{
if(h[t]<h[i*2+1])
t=2*i+1;
}
if(i!=t)
{
swap(i,t);
i=t;
}
else
flag=1;
}
}
void creat()
{
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
void heapsort()
{
while(n>1)
{
swap(1,n);
n--;
siftdown(1);
}
}
int main()
{
int num;
freopen("data.txt","r",stdin);
cin>>num;
for(int i=1;i<=num;i++)
cin>>h[i];
n=num;
creat();
heapsort();
for(int i=1;i<=num;i++)
cout<<h[i]<<" ";
return 0;
}
3.插入一个元素
插入一个元素在堆尾,维护小根堆函数代码:
void siftup(int i)
{
int flag=0;//用来标记是否需要向上继续调整
if(i==1) return;
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])
swap(i,i/2);
else
flag=1;
i/=2;
}
}