void HeapAdjust(char *a,int i,int size) //调整堆
{
int lchild=2*i; //i的左孩子节点序号
int rchild=2*i+1; //i的右孩子节点序号
int max=i; //临时变量
if(i<=size/2) //如果i不是叶节点就不用进行调整
{
if((lchild<=size)&&(a[lchild]>a[max]))
{
max=lchild;
}
if((rchild<=size)&&(a[rchild]>a[max]))
{
max=rchild;
}
if(max!=i)
{
char tmp = a[i];
a[i] = a[max];
a[max] = tmp;
HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
void BuildHeap(char *a,int size) //建立堆
{
for(int i=size/2;i>=0;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}
void HeapSort(char *a,int size) //堆排序
{
BuildHeap(a,size);
for(int i=size;i>=1;i--)
{
char tmp = a[0];
a[0] = a[i];
a[i] = tmp;
HeapAdjust(a,0,i-1); //重新调整堆顶节点成为大顶堆
}
}