标签:堆的实现
堆结构的二叉树存储是
最大堆:每个父节点的都大于孩子节点。
最小堆:每个父节点的都小于孩子节点。孩子节点
下面,我们以小堆为例,实现堆的建立:
代码如下:
#pragma once #include<iostream> #include<vector> #include<assert.h> using namespace std; template<class T> class Heap { public: Heap() {} Heap(const T* a, size_t size) { assert(a); for (size_t i = 0; i < size; i++) { _a.push_back(a[i]); } //建堆(从第一个非叶子节点(n-1)/2) for (int i = (_a.size() - 2) / 2; i >= 0; --i) //先-1求下表 { _AdjustDown(i); } } void Push(const T& x) { _a.push_back(x); _AdjustUp(_a.size() - 1); //向上调整 } void Pop() //删除最大元素(与最后一个元素交换,在pop,最后向下调整) { assert(!_a.empty()); swap(_a[0], _a[_a.size() - 1]); _a.pop_back(); _AdjustDown(0); } protected: void _AdjustDown(size_t parent) { size_t child = parent * 2 + 1; while (child < _a.size()) { if ((child+1<_a.size())&&(_a[child] > _a[child + 1])) { child++; } if (_a[parent] > _a[child]) { swap(_a[child], _a[parent]); parent = child; child = 2 * parent + 1; } else break; } } void _AdjustUp(size_t child) { size_t parent = (child - 1) / 2; while (child > 0) { if (_a[child] > _a[parent]) { swap(_a[child], _a[parent]); child = parent; parent = (child - 1) / 2; } else { break; } } } protected: vector<T> _a; };
测试用例:
void test1() { int a[] = { 53, 17, 18, 9, 45, 65, 87, 23 }; int size = sizeof(a) / sizeof(a[0]); Heap<int> h1(a, size); /*h1.Push(30); h1.Pop();*/ }
本文出自 “朔月云影” 博客,请务必保留此出处http://19940325.blog.51cto.com/10789287/1771901
标签:堆的实现
原文地址:http://19940325.blog.51cto.com/10789287/1771901