二叉堆(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 ...
随机推荐
- LVS 部署
一.LVS的组成 LVS 由2部分程序组成,包括 ipvs 和 ipvsadm. 1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码.2 ...
- H5页面优化
1. 页面优化 优化内容: 提升网页响应速度:减少请求,文件大小,页面性能 对搜索引擎,屏幕阅读器友好: 提高可读性,可维护性:规范代码 优化操作: 减少请求:小图标使用sprite拼图合并为一个图片 ...
- chromedriver和firefox driver的安装过程
环境:ubuntu14.04, python2.7 selenium2.0 文章参考出处:http://blog.csdn.net/heybob/article/details/52922645 ch ...
- 【转载】wav文件格式分析与详解
WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...
- scrapy的useragent与代理ip
scrapy中的useragent与代理ip 方法一: user-agent我们可以直接在settings.py中更改,如下图,这样修改比较简单,但是并不推荐,更推荐的方法是修改使用scrapy的中间 ...
- Mac-MacOS降级(Mac系统降级,系统回退)
前言 最近把macOS更新到了 macOS Catalina,使用了一段时间后,结合自己的使用环境和体验,感觉 Catalina 不太好用,就想把系统回退到 macOS Mojave,但是平时几乎不用 ...
- sqli-labs-Basic Challenges
sqli_labs注入学习 一.SQL基本语法 1.1show databases; 显示MySQL数据库里边所有的库: 1.2use [table name]; 使用特定的数据库: 1.3show ...
- ARC-082F Sandglass
题意 有一个含有两个玻璃球的沙漏,分别称这两个玻璃球为\(
- #《Essential C++》读书笔记# 第六章 以template进行编程
练习题答案 练习6.1 试改写以下类,使它成为一个class template: class example { public: example(double min, double max); ex ...
- 嵌入式设备sqlite库移植和使用
1]官网下载sqlite-autoconf-3300100.tar.gz,网址https://www.sqlite.org/download.html,2]解压:tar zxvf sqlite-aut ...