堆(Heap)的建立

堆(Heap)的建立


//_Heap.h文件

<span style="font-size:14px;">#pragma once

#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Heap
{
public:
	Heap()
	{

	}
	Heap(const T*a,size_t size)
	{
		for(int i=0;i<size;i++)
		{
			_a.push_back(a[i]);
		}
		//建大堆
		cout<<"大堆:"<<endl;
		_Max_Heap();
		cout<<"小堆:"<<endl;
		//建小堆
		_Min_Heap();
	}
	//数据插入
	void _Push_Back(const T& x)
	{
		_a.push_back (x);
		_Max_Heap();
		
	}
	//数据删除
	void _Pop_Back()
	{
		 _a.pop_back();
		 _Min_Heap();
	}
	void HeapSort(int a[],int n)
	{
		_HeapSort(a,n);   
		for(int i=0;i<_a.size();i++)
		{
			cout<<_a[i]<<" ";
		}
		cout<<endl;
	}
	
protected:
	void _Max_Heap()
	{
		for(int i=_a.size()/2-1;i>=0;i--)
		{
			_AdjustDown(i);
		}
		for(int i=0;i<_a.size();i++)
		{
			cout<<_a[i]<<" ";
		}
		cout<<endl;
	}

	void _Min_Heap()
	{
	    for(int i=1;i<_a.size();i++)
		{
			_AdjustUp(i);
		}
		for(int i=0;i<_a.size();i++)
		{
			cout<<_a[i]<<" ";
		}
		cout<<endl;
	}
	//自下而上调整数据,建立大堆
	void _AdjustDown(size_t parent)
	{
		size_t child=parent*2+1;
		while(child<_a.size())
		{
			if(child+1 < _a.size())
			{
				if(_a[child] < _a[child+1])  //左子节点小于右子节点,需要比较右子节点
					child++;
			}
			if(_a[child] > _a[parent])       //父节点与子节点进行比较
			{
				swap(_a[child],_a[parent]);
				parent=child;             //父节点变子节点,用于处理执行一次循环处理后还存在父节点小于子节点情况
				child=parent*2+1;
			}
			else
			{
				break;
			}
		}
	}
	//自上而下调整数据,建立小堆
	void _AdjustUp(int child)
	{
		 int 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;
          }
	}
private:
	vector<T> _a;
};</span>
//test.cpp文件

void test1()
{
	int a[]={68,42,6,15,3,22,11,64,32,7};
	int m=sizeof(a)/sizeof(a[0]);
	 Heap<int>(a,m);
	(Heap<int>(a,m))._Push_Back(1);
	(Heap<int>(a,m))._Pop_Back();
}
int main()
{
	test1();
	getchar();
	return 0;
}
运行结果:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值