说真的浙大的老师讲的挺好的。其中建堆的时候引用了哨兵概念少了很多判断,然后用堆的插入删除操作做起来简直飞快。
贴一个自己练习的代码
贴的是最大堆,最小堆的操作其实是类似的。
其实堆在其他地方还叫做优先队列。自己模拟堆的话,还可以遍历。直接用STL的话,不能遍历。
#include<bits/stdc++.h>
using namespace std;
int H[2000];
int Hsize,n,x;
void createH()
{
memset(H,0,sizeof(H));
Hsize=0;
H[0]=99999;//在开头引入哨兵。保证0的位置绝对最大
}
void heap_insert(int x)//本质上是在最后插入一个元素然后不断调整
{
int i;
for(i=++Hsize; H[i/2]<x; i/=2)//每次Hsize++,同时不断判断父节点是否比当前值小
H[i]=H[i/2]; //如果小,当前值赋值成当前父节点,然后继续往上更新,就是不断把大值上调的过程
H[i]=x; //直到找到合适的位置放入x
}
int heap_delete()
{
int temp,parent,child,Maxitem;
Maxitem=H[1];
temp=H[Hsize--];
for(parent=1;parent*2<=Hsize;parent=child){
child=parent*2;
if(child!=Hsize&&H[child]<H[child+1])
child++;
if(temp>=H[child])
break;
else H[parent]=H[child];
}
H[parent]=temp;
return Maxitem;
}
int main()
{
createH();
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x;
heap_insert(x);
}
cout<<"delete :"<<heap_delete()<<endl;
cout<<Hsize<<endl;
for(int i=0;i<=Hsize;i++)
cout<<H[i]<<" ";
cout<<endl;
return 0;
}