最小堆的实现

这是一个最小堆的模板实现,遗憾的是没有使用模板特化,否则使用起来会更方便,这个实现似乎还有些问题,在析构的时候会出现错误,但是我没有找到原因,很是郁闷。没什么好说的,代码跟书上的没什么两样……

#ifndef MINHEAP_H_

#define MINHEAP_H_

 

#include <cstddef>

#include <iostream>

 

const size_t DEFAULT_CAP = 20;    //default capacity

 

template< class Type >

class  ITEM

{

public:

   Type item;

   int key;

public:

   ITEM() {}

   ITEM( const Type& it, int k) : item(it), key(k) {}  

   ITEM<Type>& operator=( const ITEM<Type>& it) {

      item = it.item;

      key = it.key;

      return *this;

   }

};

 

 

template <class Type> class MinHeap

{

public:

   MinHeap() : m_size(0), m_capacity(DEFAULT_CAP)

   {

      m_pcontainer = new Type[m_capacity];

   }

  

   MinHeap( size_t cap) : m_size(0), m_capacity(cap)

   {

      m_capacity = (cap > DEFAULT_CAP) ? cap : DEFAULT_CAP;

      m_pcontainer = new Type[m_capacity];

   }

  

   MinHeap( Type* ary, size_t n)

   {

      m_capacity = n>m_capacity? n : m_capacity;

      m_pcontainer = new Type[m_capacity];

     

      for(int i=0; i<n; i++) {

         m_pcontainer = ary[i];  

      }

      m_size = n;

   }

  

   MinHeap( const MinHeap& hp )

   {

      m_size = hp.m_size;

      m_capacity = hp.m_capacity;

      m_pcontainer = new Type[m_capacity];

      for( int i=0; i<m_size; i++) {

         m_pcontainer[i] = hp.m_pcontainer[i];

      }

   }

  

   ~MinHeap()

   {

      delete[] m_pcontainer;

   }

  

   size_t size() const { return m_size; }

  

   size_t capacity() const { return m_capacity; }

  

   bool IsEmpty() const { return m_size == 0; }

   bool IsFull() const { return  m_capacity == m_size; }

   void MakeEmpty() { size = 0; }

  

   bool Insert( const Type& x )

   {

      if( m_size == m_capacity ) {

         std::cout << "Heap Is Full!/n" << std::endl;

         return false;

      } else {

         m_pcontainer[m_size] = x;

         m_size++;

         FilterUp(m_size-1);

         return true;

      }    

   }

  

   bool RemoveMin(Type& x)

   {

      if( m_size == 0) {

         std::cout << "Heap Is Empty!/n" << std::endl;

         return false;

      } else {

         x = m_pcontainer[0];

         m_pcontainer[0] = m_pcontainer[--m_size];

         FilterDown(0, m_size-1);

         return true;

      }    

   }

  

protected:

   void FilterDown( size_t istart, size_t iend )

   {

      size_t i = istart;    size_t j = 2*i + 1;

      Type temp = m_pcontainer[i];

      while(j<=iend) {

         if(j < iend && m_pcontainer[j].key > m_pcontainer[j+1].key) {

            j++;

         }

         if( temp.key > m_pcontainer[j].key ) {

            m_pcontainer[i] = m_pcontainer[j];

            i = j;

            j = 2*i + 1;

         } else {

            break;

         }

               

      } 

      m_pcontainer[i] = temp;    

   }

  

   void FilterUp( size_t istart )

   {

      int j = istart;

      int i =(j-1)/2;

      Type temp = m_pcontainer[j];

      while( j>0 ) {

         if( m_pcontainer[i].key > temp.key ) {

            m_pcontainer[j] = m_pcontainer[i];

            j = i;

            i = (j-1)/2;

         } else {

            break;

         }

      }

      m_pcontainer[j] = temp;    

   }

 

  

private:

   size_t m_size;              //number of contents

   size_t m_capacity;          //capacity of container

   Type* m_pcontainer;      //container

 

};

 

#endif /*MINHEAP_H_*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值