二叉堆(1)BinaryHeap
封装一个简单二叉堆,亦可视为优先队列。
测试文件 main.cpp:
#include <iostream>
#include "BinaryHeap.h"
using std::cout;
using std::endl;
int main()
{
BinaryHeap<int> bh(BinaryHeap<int>::HeapType::MINIMEM);
auto il = { ,,,,, };
bh.push(il.begin(), il.end());
cout << "Elements:\n\t";
bh.show();
cout << endl << endl;
cout << "Pop head: " << bh.top() << endl << endl;
bh.pop();
cout << "Elements:\n\t";
bh.show();
cout << endl << endl;
try
{
cout << ] << endl;
cout << "bh[5]: ";
cout << bh[] << endl;
}
catch (std::exception & e) { cout << e.what() << endl; }
;
}
头文件 "BinaryHeap.h":
#pragma once
#ifndef __BINARYHEAP_H__
#define __BINARYHEAP_H__
template<typename _Ty>
class BinaryHeap
{
public:
, MAXIMEM };
public:
BinaryHeap() = default;
BinaryHeap(HeapType _heapType) { heapType = _heapType; }
~BinaryHeap() { delete[] heapArr; heapArr = nullptr; }
; }
size_t size() { return size_n; }
template<typename _Iter>
void push(_Iter, _Iter);
void push(const _Ty&);
void pop();
_Ty& top() const;
void show() const;
_Ty& operator [] (int);
private:
bool compare(const _Ty& _a, const _Ty& _b)
{
return (heapType == HeapType::MAXIMEM) ? (_a > _b) : (_a < _b);
}
private:
size_t size_n = ;
size_t MaxSize = ;
_Ty* heapArr = nullptr;
HeapType heapType = HeapType::MAXIMEM;
};
template<typename _Ty>
template<typename _Iter>
void BinaryHeap<_Ty>::push(_Iter _it1, _Iter _it2)
{
while (_it1 != _it2)
{
push(*_it1);
++_it1;
}
}
template<typename _Ty>
void BinaryHeap<_Ty>::push(const _Ty& _val)
{
++size_n;
if (heapArr == nullptr)
{
MaxSize = ;
heapArr = new _Ty[MaxSize];
}
)
{
MaxSize << ;
_Ty* tempArr = new _Ty[MaxSize];
; it < size_n - ; ++it)
tempArr[it] = heapArr[it];
delete[] heapArr;
heapArr = tempArr;
tempArr = nullptr;
}
heapArr[size_n - ] = _val;
size_t childInex = size_n - ;
)
{
) / ]))
{
heapArr[childInex] = heapArr[(childInex - ) / ];
childInex = (childInex - ) / ;
}
else
break;
}
heapArr[childInex] = _val;
}
template<typename _Ty>
void BinaryHeap<_Ty>::pop()
{
) return;
--size_n;
heapArr[] = heapArr[size_n];
size_t childInex = ;
_Ty temp = heapArr[];
while (childInex < size_n)
{
< size_n && compare(heapArr[childInex + ], heapArr[childInex]))
++childInex;
if (compare(temp, heapArr[childInex]))
break;
heapArr[(childInex - ) / ] = heapArr[childInex];
childInex = * childInex + ;
}
heapArr[(childInex - ) / ] = temp;
}
template<typename _Ty>
_Ty& BinaryHeap<_Ty>::top() const
{
)
throw std::exception("Heap is empty.");
];
}
template<typename _Ty>
void BinaryHeap<_Ty>::show() const
{
; i < size_n; ++i)
std::cout << heapArr[i] << " ";
}
template<typename _Ty>
_Ty& BinaryHeap<_Ty>::operator [] (int _index)
{
if (_index >= size_n) throw std::exception("Index out of range.");
return heapArr[_index];
}
#endif // !__BINARYHEAP_H__
二叉堆(1)BinaryHeap的更多相关文章
- python下实现二叉堆以及堆排序
python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...
- binary-heap(二叉堆)原理及C++代码实现
二叉堆可以看做一个近似的完全二叉树,所以一般用数组来组织. 二叉堆可以分为两种形式:最大堆和最小堆.最大堆顾名思义,它的每个结点的值不能超过其父结点的值,因此堆中最大元素存放在根结点中.最小堆的组织方 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- 用于A*的 二叉堆 AS3实现
package com.copper.isometric.pathing { import flash.sampler.startSampling; /** * ...
- C# 二叉堆
二叉堆数据结构讲解: http://www.cnblogs.com/yc_sunniwell/archive/2010/06/28/1766751.html C#代码实现 using System ...
- python 二叉堆
BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中 ...
- python---使用二叉堆实现的优先队列(列表)
哟,有实用价值 可以看到,加入是随机的,而吐出是顺序的. # coding = utf-8 # 使用二叉堆实现的优先队列(列表) class BinaryHeap: def __init__(self ...
- C# 实现简单的 Heap 堆(二叉堆)
如题,C# 实现简单的二叉堆的 Push() 和 Pop(), 如有不足欢迎指正. 另外,在C#中使用 Heap 的相似功能可以考虑使用:Priority Queues,SortedDictiona ...
随机推荐
- C#的静态工厂方法与构造函数对比
最近,在与同事进行协同编程时,我们开始讨论在C#中初始化新对象的最佳方法.我一直是使用构造函数实现,尽管他倾向于静态工程方法.这引起了关于每种类型的利弊的大量来来回回的讨论. 为了说明我所说的内容,这 ...
- mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存
一,引言 首先我们要明白一点,缓存所做的一切都是为了提高性能.明白了这一点下面我们开始进入正题. 二,mybatis缓存概要 ①.mybatis的缓存有两种,分别是一级缓存和二级缓存.两者都属于查询缓 ...
- macos常用命令备查
常用命令 open . : 命令行打开文件夹 文件编辑 ps: 从一般模式进编辑模式,只需按i.I.a.A.o.O.r和R中某个键即可.当进入编辑模式时,在屏幕尾部会显示INSERT或REPLACE字 ...
- JVM类加载器是否可以加载自定义的String
前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...
- 进阶之路 | 奇妙的Drawable之旅
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: Drawable简介 Drawable分类 自定义Drawable 一.为什么要学习Drawabl ...
- C# 多线程的阻塞和继续-ManaulResetEvent的使用
在工作中,会遇到需要多线程处理相应的业务需求,最典型的包括Socket的通信. 多线程处理里,就会考虑到,哪个线程先运行,哪个线程后运行的情况. 这里我介绍一下,使用ManualResetEvent类 ...
- Tomcat 核心配置
tomcat的核心配置在conf/server.xml中. <Server> 根元素 <Server>即Catalina Servlet组件. <Server por ...
- PostgreSQL将日期转为当前年、月、日的函数date_trunc
PostgreSQL将日期转为年.月.日的函数date_trunc: 当前年: select date_trunc('year',now()) 当前月: select date_trunc('mo ...
- .NET CORE(C#) WPF 重新设计Instagram
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 重新设计Instagram 阅读导航 本文背景 代码实现 ...
- 修改计算机名并更新sqlserver中存储的服务器名称
1. 查看计算机名use master go select @@servername select serverproperty('servername') 2.同步更新SQLse ...