#ifndef __BINARY_HEAP_H__
#define __BINARY_HEAP_H__ #include <iostream>
#include <vector>
#include <assert.h> template <typename Type>
class HeapStruct {
friend std::ostream& operator<< <Type>(std::ostream& out, const HeapStruct<Type>& heap); int capacity;
int size;
Type *elements;
void initialize(int maxElements);
public:
HeapStruct(int maxElements) { initialize(maxElements); }
void destroy();
void makeEmpty();
void insert(Type element);
Type deleteMin();
Type findMin();
bool isEmpty();
void buildHeap(Type a[], int num);
}; template <typename Type>
std::ostream& operator<<(std::ostream& out, const HeapStruct<Type>& heap)
{
out << "{";
int i;
for (i = ; i < heap.size; i++)
out << heap.elements[i] << ",";
out << heap.elements[i] << "}" << endl;
return out;
} template<typename Type>
inline void HeapStruct<Type>::initialize(int maxElements)
{
elements = (Type*)malloc((maxElements + ) * sizeof(Type));
assert(elements != nullptr);
capacity = maxElements;
size = ;
elements[] = Type();
} template<typename Type>
inline void HeapStruct<Type>::destroy()
{
free(elements);
} template<typename Type>
inline void HeapStruct<Type>::makeEmpty()
{
size = ;
} template<typename Type>
void HeapStruct<Type>::buildHeap(Type a[], int num)
{
if (size + num >= capacity)
{
Type *temp = elements;
while (capacity < size + num)
capacity *= ;
elements = (Type*)malloc((capacity + ) * sizeof(Type));
assert(elements != nullptr);
memcpy(elements, temp, (size + ) * sizeof(Type));
free(temp);
}
int build_frequency = ;
for (int i = ; i < num; ++i)
elements[i + ] = a[i];
size = num;
for (int i = num / ; i > ; i--)
{
int j, child;
Type lastEmement = elements[i];
for (j = i; j * <= size; j = child)
{
child = * j;
build_frequency += ;
if (child != size && elements[child] > elements[child + ])
child++;
if (elements[child] < elements[j])
elements[j] = elements[child];
else
break;
}
elements[j] = lastEmement;
}
std::cout << "构造频数为:" << build_frequency << endl;
} template<typename Type>
inline void HeapStruct<Type>::insert(Type element)
{
if (size + > capacity)
{
Type *temp = elements;
capacity *= ;
elements = (Type*)malloc((capacity + ) * sizeof(Type));
assert(elements != nullptr);
memcpy(elements, temp, (size + ) * sizeof(Type));
free(temp);
}
int i;
for (i = ++size; elements[i / ] > element; i /= )
elements[i] = elements[i / ];
elements[i] = element;
} template<typename Type>
inline Type HeapStruct<Type>::deleteMin()
{
Type min = elements[];
Type lastEmement = elements[size--];
if (size * <= capacity)
{
Type *temp = elements;
capacity = size;
elements = (Type*)malloc((capacity + ) * sizeof(Type));
assert(elements != nullptr);
memcpy(elements, temp, (size + ) * sizeof(Type));
free(temp);
}
int i, child;
for (i = ; i * <= size; i = child)
{
child = * i;
if (child != size && elements[child] > elements[child + ])
child++;
if (elements[child] < elements[i])
elements[i] = elements[child];
else
break;
}
elements[i] = lastEmement;
return min;
} template<typename Type>
inline Type HeapStruct<Type>::findMin()
{
return elements[];
} template<typename Type>
inline bool HeapStruct<Type>::isEmpty()
{
return size;
} #endif

二叉堆 C++实现的更多相关文章

  1. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  2. codevs 3110 二叉堆练习3

    3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...

  3. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

  5. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  6. 二叉堆(二)之 C++的实现

    概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...

  7. 二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...

  8. 二叉堆(binary heap)

    堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...

  9. 在A*寻路中使用二叉堆

    接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...

  10. 《Algorithms算法》笔记:优先队列(2)——二叉堆

    二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...

随机推荐

  1. 如何快速定位到Eclipse自动添加的TODO

    把自动生成的// TODO ....前面加上todo,这样生成之后就会有编译错误,直接 ctrl+. 就到该位置了,可以删除todo留着// TODO ...,也可以ctrl+d删除一行: 不建议不生 ...

  2. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  3. 同步、异步、阻塞、非阻塞IO

    在网上看到一篇对这四个概念比较清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378.结合自己一直在学习Java ...

  4. 未来手机Alo即将问世!全息投影手机的新高峰!全息3d 网

    文章来源:网络         编辑:大熊 [摘要]全息投影手机很早就开始炒,网络上的概念机也是丛出不穷,那么这款出自法国的概念机又是多么的奇葩?全息 3d 网带你一探究竟. 据外媒报道,在不久将来语 ...

  5. intelliJ IDEA创建web工程

    1.创建project,也就是eclipse里的workspace,eclipse里1个工作空间里可以创建多个工程,idea的一个工作空间里只创建1个工程. File -- New -- Projec ...

  6. java_XML_DOM1

    一.Java DOM 的 API: 1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilder ...

  7. 判断数据是否服从某一分布(二)——简单易用fitdistrplus包

    一.对数据的分布进行初步判断     1.1 原理 对于不同的分布,有特定的偏度(skewness)和峰度(kurtosis),正态分布.均匀分布.逻辑斯谛分布.指数分布的偏度和峰度都是特定的值,在偏 ...

  8. sed 命令详解

    sed 用于筛选和转换文本的流编辑器 描述: sed是一个流编辑器,流编辑器对一个输入流执行基本的文本转换(输入流来自文件或者管道行).虽然在某些方面类似于很多可运行脚本的编辑器,但是sed的工作方式 ...

  9. Unity与Android间的交互

    1.打开Android Studio,命名并自动生成包名 2.点击Next,设置最小支持的SDK 3.点击Next,选择Empty Activity 4.点击Next,默认就行不用管 5.Finish ...

  10. Jquery AutoComplete实现搜索自动完成

    AutoComplete控件就是指用户在文本框输入前几个字母或是汉字的时候,该控件就能从存放数据的文本或是数据库里将所有以这些字母开头的数据提示给用户,供用户选择,提供方便. 例子: <!doc ...