//最小堆模板
template<typenameT>
void MinHeapify(T*arry,int size,int element)//element 元素的索引 size 数组length
{
int lchild=element*2+1,rchild=lchild+1;//左右子树
while(rchild<size)//子树均在范围内
{
//如果比左右子树都小,完成整理
if(arry[element]<=arry[lchild] && arry[element]<=arry[rchild])
{
return;
}
if(arry[lchild] <= arry[rchild])//如果左边最小
{
swap(arry[element],arry[lchild]);
element=lchild;
}
else
{
swap(arry[element],arry[rchild]);
element=rchild;
}
lchild=element*2+1;
rchild=lchild+1;
}
if(lchild < size && arry[lchild] < arry[element])//只有左子树,且子树小于自己
{
swap(arry[lchild],arry[element]);
}
return;
}
//堆排序
template<typenameT>
void HeapSort(T*arry,int size)
{
int i;
for(i=size-1;i>=0;i--)
{
MinHeapify(arry,size,i);
}
while(size>0)
{
swap(arry[size-1],arry[0]);
size--;
MinHeapify(arry,size,0);//整理树
}
return;
}
原文:http://www.cnblogs.com/Study02/p/5216442.html