108次练习之堆的声明及实现(一)
这两天研究了一下数据结构中堆的数据结构,研究完后写个代码实现一下,供大家参考!
/* *文件说明:堆的声明及实现(第一遍) *作者:高小调 *日期:2016-12-26 *集成开发环境:Microsoft Visual Studio 2010 */ #include<assert.h> #include<vector> template<typename T> class Heap{ public: Heap(){} //构造函数,构建一个堆.空间复杂度O(n*lgn) Heap(T arr[],size_t sz) :_a(arr,arr+sz){ int idx = (_a.size()-2)/2; for(;idx>=0; --idx){ _AdjustDown(idx); } } //向堆中插入一个数据 void Push(const T & e){ _a.push_back(e); int idx = (_a.size()-2)/2; _AdjustUp(idx); } //删除堆顶 void Pop(){ assert(_a.size()>0); swap(_a[_a.size()-1],_a[0]); _a.pop_back(); _AdjustDown(0); } protected: //堆的向下调整算法 void _AdjustDown(int idx){ size_t parent = idx; size_t child = idx*2+1; while(child<_a.size() && child>parent){ //右孩子存在且比左孩子小 if((child+1<_a.size()) &&_a[child]>_a[child+1]){ ++child; } //左/右孩子小于父亲结点 if(_a[parent]>_a[child]){ swap(_a[parent],_a[child]); //交换 parent = child; //向下继续调整 child = child*2+1; }else{ break; //跳出循环 } } } //堆的向上调整算法 void _AdjustUp(size_t idx){ size_t parent = idx; size_t child = idx*2+1; while(child<_a.size() && child>parent){ //右孩子存在且比左孩子小 if((child+1<_a.size()) && _a[child]>_a[child+1]){ ++child; } //左/右孩子比父节点小 if(_a[parent]>_a[child]){ swap(_a[parent],_a[child]); //交换 child = parent; //继续向上调整 parent = (child-1)/2; }else{ break; //已经是一个堆了,跳出循环 } } } private: vector<T> _a; };
/* *文件说明:测试文件 *作者:高小调 *日期:2016-12-26 *集成开发环境:Microsoft Visual Studio 2010 */ #include<iostream> using namespace std; #include"Heap.h" void TestHeap(){ int arr[] = {10,16,18,12,11,13,15,17,14,19}; size_t sz = sizeof(arr)/sizeof(arr[0]); Heap<int> h1(arr,sz); h1.Pop(); h1.Push(5); } int main(){ TestHeap(); return 0; }
PS:本人承接各种数据结构课设,想做数据结构课设的同学,可以联系我!(不过我不会告诉你我联系方式的!)