最小二叉堆

来源:互联网 发布:中国的中产阶级 知乎 编辑:程序博客网 时间:2024/05/19 12:36

由于优先队列实在好用,所以我自己也写了一个最小二叉堆,大家可以看看:



#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;
}



不妨看看!

0 0
原创粉丝点击