由于优先队列实在好用,所以我自己也写了一个最小二叉堆,大家可以看看:
#ifndef BHEAP_H
#define BHEAP_H
#include<iostream>
using namespace std;
#include<vector>
template<class Comparable>
class Bheap
{
private:
vector<Comparable> v;
int size;
public:
Bheap(int a=100)
{v.resize(a);
size=0;}
void insert(Comparable x)
{
if(size==v.capacity()-1)
v.resize(2*size);
int hole=++size;
for(;hole>1&&x<v[hole/2];hole/=2)
v[hole]=v[hole/2];
v[hole]=x;
}
void deleteMin()
{
if(isEmpty())
return;
//throw UnderflowException();
v[1]=v[size--];
Comparable x=v[1];
int child;
int i=1;
for(;2*i<=size;i=child)
{
child=i*2;
if(child!=size&&v[child]>v[child+1])
child++;
if(x>v[child])
v[i]=v[child];
else
break;
}
v[i]=x;
}
void deleteMin(Comparable &x1)
{
if(isEmpty())
return ;
// throw UnderflowException();
x1=v[1];
v[1]=v[size--];
Comparable x=v[1];
int child;
int i=1;
for(;2*i<=size;i=child)
{
child=i*2;
if(child!=size&&v[child]>v[child+1])
child++;
if(x>v[child])
v[i]=v[child];
else
break;
}
v[i]=x;
}
bool isEmpty()
{
return size==0;
}
int getsize(){
return size;
}
Comparable &findMin()
{
return v[1];
}
void print1()
{
if(isEmpty())
return;
for(int i=1;i<=size;i++)
cout<<v[i]<<" ";
}
void print2(int i=1)
{
if(isEmpty()||i>size)
return;
cout<<v[i]<<" ";
print2(2*i);
print2(2*i+1);
}
};
#endif
下面是调试代码:
#include"Bheap.h"
#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
Bheap<int>H;
int n;
cin>>n;
srand(time(NULL));
for(int i=1;i<=n;i++)
H.insert(rand()%n);
vector<int>a(n);
for(int i=0;i<n;i++)
{
H.deleteMin(a[i]);
cout<<a[i]<<" ";
}
cout<<endl;
/*for(i=1;i<20;i++)
H.deleteMin();
H.print1();*/
return 0;
}
不妨看看!