//堆排序算法过程是,先制造大顶堆,然后通过不断摘取根节点(最大值)并重塑大顶堆的过程,将序列有
//序化。
void HeapSort(ElemType A[],int len)
{
int i;
BuildMaxHeap(A,len);//塑造大顶堆
for(i=len;i>1;i--)
{
swap(A[i],A[1]);//摘取最大值
AdjustDown(A,1,i-1);//重新塑造大顶堆,注意现在的末元素是i-1
}
}
void BuildMaxHeap(ElemType A[],int len)
{
for(int i=len/2;i>0;i--)//从最后一个叶子结点的父节点开始,将树中结点最大值逐步传到根节点
AdjustDown(A,i,len);
}
void AdjustDown(ElemType A[],int k,int len)
{
int i;
A[0]=A[k];//保存该结点数值
for(i=2*k;i<len;i*=2)
{
if(i<len&&A[i]<A[i+1])//选出左右结点中最大的结点
i++;
if(A[0]>=A[i])//A[0]节点大则找到该数值插入的位置
break;
else{//否则将数值大的子结点上移替补父节点,并沿该子结点的路径找A[0]结点该插入的位置
A[k]=A[i];
k=i;
}
}
A[k]=A[0];//找到A[0]数值的位置并插入
}
空间复杂度为O(1);时间复杂度为:建堆部分(O(n))+调堆部分(O(nlogn))=O(nlogn)。堆排序是不稳定的。