堆(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;
}
运行结果: