`

实用类之一-----最小堆的实现

 
阅读更多
最小(大)堆是比较常用的数据结构,是实现优先队列和堆排序的基础,也可以实现例如霍夫曼编码,贪心算法等,具有很好的时间复杂性.

MinHeap.h文件

template<class T>
class MinHeap{
 public:
  MinHeap(T a[],int n);
  MinHeap(int ms);
  ~MinHeap();
  bool Insert(const T &x);//插入一个元素,如果空返回false,否则返回true
     bool RemoveMin(T &x);//删除最小的元素,如果空返回false,否则返回true
  void MakeEmpty();//使堆为空
  bool IsEmpty();
  bool IsFull();
  void FilterDown(const int start,const int endOfHeap);//自顶向下构造堆
  void FilterUp(const int start);//自底向上构造堆
 private:
  T *heap;
  int maxSize;
  const int defaultSize;
  int currentSize;
};
template<class T>
MinHeap<T>::MinHeap(int ms):defaultSize(100){
 maxSize = ms > defaultSize ? ms : defaultSize;
 heap = new T[maxSize];
 currentSize = 0;
}
template<class T>
MinHeap<T>::MinHeap(T a[],int n):defaultSize(100){
 maxSize = n > defaultSize ? n : defaultSize;
 heap = new T[maxSize];
 currentSize = n;
   heap = a;
 int curPos = (currentSize - 2) / 2;
 while(curPos >= 0){
   FilterDown(curPos,currentSize - 1);
   curPos--;
 }
}
template<class T>
MinHeap<T>::~MinHeap(){
 delete []heap;
}
template<class T>
void MinHeap<T>::FilterDown(const int start,const int endOfHeap){
 int i = start,j = i * 2 + 1;
 T temp = heap[i];
 while(j <= endOfHeap){
   if(j < endOfHeap && heap[j] > heap[j+1]) j++;
   if(temp < heap[j]) break;
   else{
    heap[i] = heap[j];
    i = j;
    j = 2 * i + 1;
   }
 }
 heap[i] = temp;
}
template<class T>
void MinHeap<T>::FilterUp(const int start){
 int i = start, j = ( i - 1 ) / 2;
 T temp = heap[i];
 while(i > 0){
   if(temp >= heap[j]) break;
   else{
    heap[i] = heap[j];
    i = j;
    j = (i - 1) / 2;
   }
 }
 heap[i] = temp;
}
template<class T>
bool MinHeap<T>::RemoveMin(T &x){
 if(IsEmpty()){
  cerr<<"Heap empty!"<<endl;
  return false;
 }
 x = heap[0];
 heap[0] = heap[currentSize - 1];
 currentSize--;
 FilterDown(0,currentSize-1);
 return true;
}
template<class T>
bool MinHeap<T>::Insert(const T& x){
 if(IsFull()) {
  cerr<<"Heap Full!"<<endl;
        return false;
 }
 heap[currentSize] = x;
 FilterUp(currentSize);
 currentSize++;
 return true;
}
template<class T>
bool MinHeap<T>::IsEmpty(){
  return currentSize == 0;
}
 
template<class T>
bool MinHeap<T>::IsFull(){
  return currentSize == maxSize;
}

template<class T>
void MinHeap<T>::MakeEmpty(){
 currentSize = 0
}

main.cpp测试文件:

#include<iostream>
#include"MinHeap.h"
using namespace std;

void main(){
 int a[5] = {3,2,1,4,5};
    MinHeap<int> m_heap(a,5);
 int x,i;
 for(i = 0; i < 5; i++){
   m_heap.RemoveMin(x);
   cout << x << " ";
 }
 cout << endl; 

    for(i = 0; i < 5; i++){
    m_heap.Insert(a[i]);
 }

 for(i = 0; i < 5; i++){
   m_heap.RemoveMin(x);
   cout << x << " ";
 }
 cout << endl; 
}

分享到:
评论
4 楼 RyanPoy 2007-05-17  
这个程序有问题
3 楼 simohayha 2007-04-10  
hurricane1026 写道
新手可以google啊。抄袭的东西用啊。。。
而且注释基本没有,对新手来说也是不适合的说.
2 楼 抛出异常的爱 2007-04-10  
对于新手还是有用的
建议移到新手区。。。
1 楼 fuliang 2007-04-10  
都是原创呀,我以前的blog前台用不了了,我把他们都转移到这了。你说数据结构的的东西不写代码表示,用语言说,能说出什么?

相关推荐

    利用堆实现带有文件操作的huffman编译码

    8. **实现细节**:在`利用堆实现带有文件操作的huffman编码.cpp`源文件中,应包含适当的头文件,定义数据结构(如节点类),实现堆操作(如插入、删除最小元素),以及哈夫曼编码和解码的算法。同时,文件操作的代码...

    最佳管道铺设方案(最小生成树)

    - **最小生成树(MST)**:对于一个加权无向图而言,如果存在一棵生成树,它的所有边的权重之和是最小的,则称这棵树为该图的一个最小生成树。 - **Kruskal 算法**:一种用于寻找最小生成树的贪心算法。该算法的基本...

    计算最小路径(模拟gps)

    根据描述,这个项目可能采用了其中之一,或者结合了两者的特点。算法的实现通常涉及优先队列(如堆结构)和图的邻接表表示,以高效地查找和更新最短路径。 文件的存储可能使用了Java的I/O流技术,包括File类、...

    数据结构实用教程讲课教案

    - **堆**: 一种完全二叉树结构,分为最大堆和最小堆,其中最大堆的每个节点的值都大于等于其子节点的值,最小堆则相反。 **2.4 平衡二叉树** - **平衡二叉树**: 一种高度平衡的二叉搜索树,能够保持树的高度尽可能...

    vc源代码合集0951.rar

    2012-06-12 11:51 103,936 最大堆实现排序(从大到小输出).doc 2012-06-12 11:51 240,128 最小生成树(prim算法)贪心算法.doc 2012-06-12 12:26 772,419 最简单的c++静态链接.zip 2012-06-12 11:45 202,240 最长...

    JAVA算法起步之堆排序实例

    - 堆是一个近似完全二叉树的数组表示,其中每个父节点的值要么大于或等于(最大堆),要么小于或等于(最小堆)其子节点的值。 - 最大堆中,根节点的值是堆中最大的元素;最小堆中,根节点的值是最小的元素。 2. ...

    C常用算法程序集分类大全

    - **冒泡排序**:最基础的排序算法之一,通过不断交换相邻元素来达到排序的目的。 - **选择排序**:每次选择未排序部分的最小(或最大)元素,放到已排序部分的末尾。 - **插入排序**:将未排序元素逐个插入到已...

    一类运输问题的数学模型及算法研究

    本文研究了一类典型的运输问题——如何在确保满足品位限制、供需限制、车辆容量限制等约束条件下,实现总运量和出动卡车数量最小化的优化目标。这类问题在露天矿山等场景中尤为常见,具有很高的实用价值。 #### 二...

    程序员实用算法

    在IT行业中,算法是程序员的核心竞争力之一。它不仅是解决问题的关键工具,也是提升代码效率、优化程序性能的重要手段。本资源“程序员实用算法”专注于为程序员提供一系列实际工作中的算法知识和应用技巧,旨在帮助...

    实验报告之算法实现哈弗曼编码

    2. 建立优先队列:以频率作为键值,使用最小堆实现,将所有叶子节点插入队列。 3. 合并:重复从队列中取出两个权值最小的节点,合并成一个新的内部节点,权值为两个子节点的权值之和,然后将新节点插入队列。此过程...

    一种改进的Dijkstra算法的分析及程序实现

    其中,Dijkstra算法是最为经典且高效的算法之一,尤其适用于带有非负权重的图。 #### 1. 传统Dijkstra算法 Dijkstra算法的基本思想是逐步扩展从源点到其他顶点的路径集合,确保每一步所选择的路径都是从源点出发的...

    重要!!!130925-installanywhere译文

    ### InstallAnywhere 知识点详解 #### 一、概览 InstallAnywhere 是一款功能强大的跨平台安装构建工具,能够帮助开发者轻松创建适用于多种操作...无论是对于开发人员还是最终用户来说,都是一款非常实用且强大的工具。

    数据结构与算法分析java版

    - **堆的定义**:定义最大堆与最小堆的概念。 - **堆的应用**:讨论堆在优先级队列等场景中的应用。 ##### 第五部分:图论 - **第13章:图**(第438页) - **图的基本概念**:介绍图的基本定义及其分类。 - **...

    数据结构与算法分析_java语言描述

    本书由Mark Allen Weiss撰写,是计算机科学领域内学习数据结构与算法的经典教材之一。接下来,我们将按照各章节的大致内容进行概述,并强调一些重要的概念。 ### 一、介绍(Chapter 1) - **数据结构的重要性**:...

    [徐士良] 实用数据结构 ppt

    4. **树**:树形结构模拟了自然界中的层次关系,包括二叉树、平衡树(如AVL树、红黑树)、堆(如最大堆、最小堆)等。它们在搜索、排序、优先级队列等领域有广泛应用。 5. **图**:图用于表示对象之间的复杂关系,...

    数据业务工程师DB2入门指南

    - 定义:节点编目是DB2中用于实现客户端与服务器之间通信的关键技术之一。 - 目的:通过编目远程节点,可以实现跨网络的数据库访问。 - 配置:使用`DB2 CATALOG NODE`命令进行节点编目。 - **1.3.2 DB2 License*...

Global site tag (gtag.js) - Google Analytics