[模板] 二叉堆 - 优先队列的二叉堆数组实现
2017-08-19 20:53
627 查看
最近开始学数据结构,一直无心更新博客,今天结束集训,晚上打算码一下最近的进度。
/* * 创建一个最大容量为MaxSize的int型堆:MaxHeap<int> que(MaxSize); * 默认最大容量为1007:MaxHeap<int> que; * * 作为优先队列: * pop(); 同优先队列pop(),如果队列已为空还要执行pop,就会执行死循环以报错。 * push(); 同优先队列push(),如果队列已满,就会执行死循环以报错。 * top(); 同优先队列top() * empty(); 同优先队列empty() * * 支持结构体,需要重载小于号(<)。 * 其它自带类型数据可以调用functional里的库函数: * #include <functional> * MaxHeap<int, greater<int> > que; //最小化堆 * MaxHeap<int> q; 等价于 MaxHeap<int, less<int> > q; //最大化堆 */ template<class T, class Compare = std::less<T> > class MaxHeap { private: T *Heap;// 数据 int Capacity, Size;// 总的容量,实际容量 Compare cmp; void filterdown(int start, int end) {// 最大堆的向下调整算法 int index = start; int cur = index << 1;// 先指向左儿子 T tmp = Heap[index]; while (cur <= end) { if (cur < end && cmp(Heap[cur], Heap[cur + 1])) {// cur+1是右儿子 cur++;// 如果右儿子比较大,就将cur指向右儿子 } if (!cmp(tmp, Heap[cur])) break;//调整结束 Heap[index] = Heap[cur]; index = cur; cur <<= 1; } Heap[index] = tmp; } void filterup(int start) {// 最大堆的向上调整算法(从start开始向上直到1,调整堆) int cur = start; int pre = cur >> 1; T tmp = Heap[cur]; while (cur > 1) { if (!cmp(Heap[pre], tmp)) break; Heap[cur] = Heap[pre]; cur = pre; pre >>= 1; } Heap[cur] = tmp; } int getindex(T data) {// 返回data在二叉堆中的索引 for (int i = 1; i <= Size; i++) if (Heap[i] == data) return i; return -1; } bool remove(T data) {// 删除最大堆中的data,成功返回true if (Size == 0) return false; int index = getindex(data);// 获取data在二叉堆中的索引 if (index == -1) return false; Heap[index] = Heap[Size--]; filterdown(index, Size); return true; } void print() {// 打印二叉堆 for (int i = 1; i < Size; i++) cout << Heap[i] << ' '; cout << Heap[Size] << endl; } public: MaxHeap(T *tmp, int len, int capactity) {//要传入的数组和长度,以及堆的最大size,数组下标从1开始 Capacity = capactity; Size = 0; Heap = new T[capactity + 7]; if (len == 0) return; for (int i = 1; i <= len; i++) push(tmp[i]); } MaxHeap(int capactity = 1007) { Capacity = capactity; Size = 0; Heap = new T[capactity + 7]; } ~MaxHeap() { delete (Heap); } void pop() { if (Size == 0) return; Heap[1] = Heap[Size--]; filterdown(1, Size); } T top() { if (Size == 0) while (true); return Heap[1]; } bool empty() { return Size == 0; } bool push(T data) {// 将data插入到二叉堆中 if (Size == Capacity) return false; Heap[++Size] = data; filterup(Size); return true; } };
相关文章推荐
- 优先队列的数组、二叉堆实现
- 二叉堆实现优先队列中的上滤和下滤
- 二叉堆实现优先队列
- 使用二叉堆实现优先队列
- 优先队列之二叉堆(JAVA实现)
- 自己写GoBinaryHead 二叉堆binaryheap实现优先队列(堆)
- 排序算法之——优先队列经典实现(基于二叉堆)
- 数据结构之优先队列--二叉堆(Java实现)
- 数据结构_使用二叉堆实现优先队列
- 优先队列二叉堆 C语言实现
- 二叉堆的实现和详解(优先队列的基础)
- 用二叉堆实现优先队列
- 优先级队列:关键字小的优先处理。数组结构实现的优先级队列
- 基于数组的循环队列(C++模板实现)
- 自己实现一个简单的优先队列-二叉堆
- 利用数组和链表实现优先队列
- 使用数组和模板实现的队列
- 优先队列(二叉堆)的基本实现
- 二叉堆,堆排序,STL优先队列的底层实现,剑指offer数据流中的中位数
- 优先队列的Java实现(最大二叉堆)