最大最小堆详解:http://cmsblogs.com/?p=4655
个人代码:
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[110],cut=0;
void Insert(int x)//堆的插入操作
{
a[++cut]=x;
for(int i=cut;i/2>0;i/=2)
{
if(a[i]<a[i/2])
swap(a[i],a[i/2]);
else
break;
}
}
void Delete()//堆的删除操作
{
if(cut<=1)//如果当前堆只有一个元素
{
a[1]=a[0];
cut=0;
return ;
}
a[1]=a[cut--];
for(int i=1,p;i*2<=cut;i=p)
{
p=i*2;
if(i*2+1<=cut&&a[i*2+1]<a[i*2])
p=i*2+1;
if(a[i]>a[p])
swap(a[i],a[p]);
else
break;
}
}
int main()
{
int n,m;
while(~scanf("%d",&n))//1为插入,2为弹出
{
switch(n)
{
case 1:
scanf("%d",&m);
Insert(m);
break;
case 2:
printf("----->%d\n",a[1]);
Delete();
}
}
}