最小(大)堆是比较常用的数据结构,是实现优先队列和堆排序的基础,也可以实现例如霍夫曼编码,贪心算法等,具有很好的时间复杂性.
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;
}
分享到:
相关推荐
8. **实现细节**:在`利用堆实现带有文件操作的huffman编码.cpp`源文件中,应包含适当的头文件,定义数据结构(如节点类),实现堆操作(如插入、删除最小元素),以及哈夫曼编码和解码的算法。同时,文件操作的代码...
- **最小生成树(MST)**:对于一个加权无向图而言,如果存在一棵生成树,它的所有边的权重之和是最小的,则称这棵树为该图的一个最小生成树。 - **Kruskal 算法**:一种用于寻找最小生成树的贪心算法。该算法的基本...
根据描述,这个项目可能采用了其中之一,或者结合了两者的特点。算法的实现通常涉及优先队列(如堆结构)和图的邻接表表示,以高效地查找和更新最短路径。 文件的存储可能使用了Java的I/O流技术,包括File类、...
- **堆**: 一种完全二叉树结构,分为最大堆和最小堆,其中最大堆的每个节点的值都大于等于其子节点的值,最小堆则相反。 **2.4 平衡二叉树** - **平衡二叉树**: 一种高度平衡的二叉搜索树,能够保持树的高度尽可能...
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 最长...
- 堆是一个近似完全二叉树的数组表示,其中每个父节点的值要么大于或等于(最大堆),要么小于或等于(最小堆)其子节点的值。 - 最大堆中,根节点的值是堆中最大的元素;最小堆中,根节点的值是最小的元素。 2. ...
- **冒泡排序**:最基础的排序算法之一,通过不断交换相邻元素来达到排序的目的。 - **选择排序**:每次选择未排序部分的最小(或最大)元素,放到已排序部分的末尾。 - **插入排序**:将未排序元素逐个插入到已...
本文研究了一类典型的运输问题——如何在确保满足品位限制、供需限制、车辆容量限制等约束条件下,实现总运量和出动卡车数量最小化的优化目标。这类问题在露天矿山等场景中尤为常见,具有很高的实用价值。 #### 二...
在IT行业中,算法是程序员的核心竞争力之一。它不仅是解决问题的关键工具,也是提升代码效率、优化程序性能的重要手段。本资源“程序员实用算法”专注于为程序员提供一系列实际工作中的算法知识和应用技巧,旨在帮助...
2. 建立优先队列:以频率作为键值,使用最小堆实现,将所有叶子节点插入队列。 3. 合并:重复从队列中取出两个权值最小的节点,合并成一个新的内部节点,权值为两个子节点的权值之和,然后将新节点插入队列。此过程...
其中,Dijkstra算法是最为经典且高效的算法之一,尤其适用于带有非负权重的图。 #### 1. 传统Dijkstra算法 Dijkstra算法的基本思想是逐步扩展从源点到其他顶点的路径集合,确保每一步所选择的路径都是从源点出发的...
### InstallAnywhere 知识点详解 #### 一、概览 InstallAnywhere 是一款功能强大的跨平台安装构建工具,能够帮助开发者轻松创建适用于多种操作...无论是对于开发人员还是最终用户来说,都是一款非常实用且强大的工具。
- **堆的定义**:定义最大堆与最小堆的概念。 - **堆的应用**:讨论堆在优先级队列等场景中的应用。 ##### 第五部分:图论 - **第13章:图**(第438页) - **图的基本概念**:介绍图的基本定义及其分类。 - **...
本书由Mark Allen Weiss撰写,是计算机科学领域内学习数据结构与算法的经典教材之一。接下来,我们将按照各章节的大致内容进行概述,并强调一些重要的概念。 ### 一、介绍(Chapter 1) - **数据结构的重要性**:...
4. **树**:树形结构模拟了自然界中的层次关系,包括二叉树、平衡树(如AVL树、红黑树)、堆(如最大堆、最小堆)等。它们在搜索、排序、优先级队列等领域有广泛应用。 5. **图**:图用于表示对象之间的复杂关系,...
- 定义:节点编目是DB2中用于实现客户端与服务器之间通信的关键技术之一。 - 目的:通过编目远程节点,可以实现跨网络的数据库访问。 - 配置:使用`DB2 CATALOG NODE`命令进行节点编目。 - **1.3.2 DB2 License*...