最小堆的实现

原创 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_*/

 

数据结构之最小堆的实现C++版

数据结构之最小堆的实现C++版   完全二叉树之所以用数组的方式存在,在于他的一个特性 若子节点为i,则父节点为(i-1)/2,注意c++特性,该结果肯定是个整数。 若父节点为j,则子节...
  • huangyimo
  • huangyimo
  • 2017年05月19日 20:23
  • 420

手工实现堆(最小堆)

做ACM班作业时候数据结构有一题要用优先数列,明显不会,看来网上的都是用C++的STL封装函数做的,作为一个有理想的人,怎么能在不知道原理的情况下直接套用呢?所以我去看了一下优先数列,发现又跟堆这个概...
  • SeasonJoe
  • SeasonJoe
  • 2015年12月12日 18:05
  • 1166

最大堆(最小堆)C++实现源码

写在前面最近渐渐爱上写博客,觉得每天学到的知识需要保鲜,写的源码也能及时与大家分享,接下来进入正题。最大堆(最小堆)最大堆(或最小堆)是非常重要的数据结构,公司面试时经常会被问到,在这里,我不会详细介...
  • wedy542700927
  • wedy542700927
  • 2017年04月24日 17:16
  • 1314

最小堆的数组实现

#include using namespace std; #define Maxn 1010 class heapClass { private: int heap[Maxn],len; pub...
  • xiaofang3a
  • xiaofang3a
  • 2016年12月25日 13:58
  • 573

最小堆解决Top K问题

问题描述:有一组数据n个,要求取出这组数据中最大的K个值。 对于这个问题,解法有很多中。比如排序及部分排序,不过效率最高的要数最小堆,它的时间复杂度为O(nlogk)。 解题思路: 取出数组的前n...
  • wangshuang1631
  • wangshuang1631
  • 2016年11月18日 17:11
  • 2203

运用并查集与最小堆实现Kruskal算法

前言 Kruskal是在一个图(图论)中生成最小生成树的算法之一。(另外还有Prim算法,之后会涉及到)这就牵扯到了最小生成树的概念,其实就是总权值最小的一个连通无回路的子图。(结合下文的示意图不难...
  • weixin_37818081
  • weixin_37818081
  • 2017年12月01日 22:24
  • 168

Java最小堆实现

package boke.heap1;      /**   * 堆结点   *    * @since jdk1.5及其以上   * @author 毛正吉   * @version ...
  • li_zhenxing
  • li_zhenxing
  • 2014年06月02日 22:14
  • 1470

Java heap的实现 最小堆的实现 代码简洁

public class HeapMin { private int[] Heap; private int maxsize; private int size; public HeapM...
  • caimo
  • caimo
  • 2014年02月18日 10:25
  • 10410

最大堆与最小堆的实现

最近算法课作业是最小堆,于是便顺便写了这个代码 最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质。 (2)父节点的键值(大于)小于等于子节点的键值 (3)在堆排序中我们通...
  • enjoy5512
  • enjoy5512
  • 2016年03月30日 20:57
  • 1427

最小堆和最大堆的JAVA实现

/** * 文件名:BinaryHeap.java * 时间:2014年11月3日下午7:15:34 * 作者:修维康 */ package chapter6; import java.ut...
  • xiuweikang
  • xiuweikang
  • 2014年11月04日 16:37
  • 4422
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小堆的实现
举报原因:
原因补充:

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