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;
}

 

posted @ 2016-12-27 18:41  数据结构专题  阅读(193)  评论(0编辑  收藏  举报