c语言数据结构堆排序

问题遇到的现象和发生背景

c语言堆排序
数据结构
排序结果出来一直是错误的,请各位能我看看,感谢!

问题相关代码,请勿粘贴截图

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
void buidheap(int a[],int low,int high)
{
    int i=low,j=2*i;
    int tmp=a[i];
    while(j<=high)
    {
        if(j<high&&a[j]<a[j+1])
        {
            j++;
        }
        if(tmp<a[j])
        {
            a[i]=a[j];
            i=j;
            j=2*i;
        }
        else
            break;
    }
    a[i]=tmp;
}
void swap(int *x, int *y)
//指针变量交换两个数的值,函数内部要交换两个数的值要通过指针交换
{
    int t = *x;
    *x = *y;
    *y = t;
}
void heapsort(int a[],int n)
{
    int i;
    for(i=n/2;i>=1;i--)
     buidheap(a,i,n);
    for(i=n;i>=2;i--)
    {
        swap(&a[1],&a[i]);//下标从1到n;每次第一个元素与最后一个元素交换
        buidheap(a,1,i-1);//每swap一次,需要build的元素少一个
    }
}
int main()
{
    int n,a[MaxSize],i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    heapsort(a,n);
    for(j=0;j<n;j++)
    {
        printf("%d ",a[j]);
    }
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

//时间复杂度O(logN)
void DwonAdjust(int a, int n, int root)//向下调整,左右子树都为同种堆才能使用
{
int parent = root;
int child = parent * 2 + 1;//默认左孩子
while (child<n)
{
//选出左右孩子中大的那一个,建大堆换一下比较符
if (a[child + 1] > a[child] && child < n - 1)
child++;
if (a[child] > a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
//整体时间复杂度O(NlogN)
void HeapSort(int
a, int n)
{
//建堆,时间复杂度O(N)
for (int i = (n - 2) / 2; i >= 0; i--)//从最后一个非叶节点调
DwonAdjust(a, n, i);
//排升序建大堆
int end = n - 1;
while (end > 0)
{
Swap(&a[0], &a[end]);
DwonAdjust(a, end, 0);
end--;
}
}