数据结构学习----最小堆实现


#ifndef HEAP
#define HEAP
template<class T>
class Heap
{
private:
T *data;
int size;
int maxSize;
void Sink(int start,int m); //从start到m下滑调整成最小堆
void Raise(int start); //从start到0上滑调整成最小堆
public:
Heap(){data=new T[100]; maxSize=100; size=0;}
Heap(int _maxSize);
Heap(T arr[],int length);
~Heap(){delete []data;}
void Push(T x);
T PopMin();
bool IsEmpty(){return size==0?true:false;}
int Size(){return size;}
void Clear(){size=0;}
void Out();
};
#endif

template<class T>
void Heap<T>::Sink(int start, int m)
{
int i,j;
T temp=data[start];
for(i=start,j=2*i+1; j<=m; i=j,j=2*j+1)
{
if(j<m&&data[j]>data[j+1]) j++;
if(temp<data[j])
break;
else
data[i]=data[j];
}
data[i]=temp;
}

template<class T>
void Heap<T>::Raise(int start)
{
int i,j;
T temp=data[start];
for(j=start,i=(j-1)/2; j>0; j=i,i=(i-1)/2)
if(data[i]<temp)
break;
else
data[j]=data[i];
data[j]=temp;
}

template<class T>
Heap<T>::Heap(int _maxSize)
{
maxSize=_maxSiz>=100?_maxSiz:100;
data=new T[maxSize];
size=0;
if(data==NULL)
Error("堆建立失败");
}

template<class T>
Heap<T>::Heap(T arr[], int length)
{
maxSize=length;
data=new T[mmaxSize];
for(int i=0;i<n;i+)
{
data[i]=arr[i];
size++;
}
int current=size/2-1;
while(current>=0)
{
Sink(current,size-1);
current--;
}
}

template<class T>
void Heap<T>::Push(T x)
{
if(size>=maxSize)
return;
data[size]=x;
Raise(size);
size++;
}

template<class T>
T Heap<T>::PopMin()
{
if(size==0)
Error("弹出数据错误!");
T x;
x=data[0];
data[0]=data[size-1];
size--;
Sink(0,size-1);
return x;
}

template<class T>
void Heap<T>::Out()
{
for(int i=0;i<size;i++)
{
cout<<data[i]<<",";
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值