void AdjustDown(ElemType A[], int k, int len)
{
//函数AdjustDown是将元素i向下进行调整
A[0]=A[k];//A[0]暂存
for(i=2*k; i<len; i*=2)//沿key较大的子节点向下进行筛选
{
if(i<len && A[i]<A[i+1])
i++;//获取key叫到的子节点的下标
if(A[0]>=A[i])
{
break;//筛选结束
}else{
A[k]=A[i];//将A[i]调整到双亲节点上
k=i;//修改k值,以便继续向下筛选
}
}
A[k]=A[0];//被筛选的值存放到最终的位置
}
void BuildMaxHeap(ElemType A[], int len)
{
for(int i=len/2; i>0; i--)//从i[n/2]~1,反复调整堆
{
AdjustDown(A, i, len);
}
}
void HeapSort(ElemType A[], int len)
{
BuildMaxHeap(A, len);//初始建堆
for(i=len; i>1; i--)//n-1趟的交换和建堆过程
{
Swap(A[i], A[1]);//输出堆顶的元素(和堆低元素进行交换)
AdjustDown(A, 1, i-1);//整理把剩余的i-1个元素整理成堆
}
}
时间复杂度:o(nlog2n)(以2为底的对数,2不会写成下标的形式)
不稳定排序