最小堆的实现

原创 2006年05月28日 21:10:00

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

#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_*/

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

简单优先队列实现-基于最小堆

一、什么是优先队列优先队列不是按照普通对象先进先出原FIFO则进行数据操作,其中的元素有优先级属性,优先级高的元素先出队。本文提到的优先队列,是基于最小堆原理实现。 二、什么是最小堆最小堆是一个完全二...

最小堆的实现和操作

[数据结构]最小堆的类模板实现

堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为最大堆和最小堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。1...

算法——TOP K问题最小堆实现扩展

概述上文我们讲到TOP K问题最小堆的实现,采用的比较基本数据类型int。这里我们将扩展到比较对象代码实现这里我们直接上代码,这里的扩展最小堆我们取名为ExMinHeap,实现如下package or...

最小堆 / 优先队列(C语言实现)

最近找实习,复习下数据结构方面的内容:用C语言实现最小堆/优先队列。并通过最小堆求解查找第k大元素的问题。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)