编辑代码

#include <stdio.h>

void sift(int a[],int low,int high){
    //对操作的子树进行堆排序
    int i=low,j=2*i+1;
    int temp=a[i];
    while(j<=high){
        if(j<high && a[j]<a[j+1]){
            ++j;
        }
        if(temp<a[j]){
            a[i]=a[j];
            i=j;
            j=2*i+1;
        }else{
            break;
        }
    }
    a[i]=temp;
}

void heapSort(int a[],int n){
    for(int i=n/2-1;i>=0;--i){
        sift(a,i,n-1);
    }
    printf("构造后的大根堆为:");
    printSort(a,n);
    printf("\n");
    printf("从大到小依次为:");
    for(int i=n-1;i>=0;--i){
        int temp=a[0];
        a[0]=a[i];
        a[i]=temp;
        sift(a,0,i-1);
        printf("%d ",a[i]);
    }
}

void printSort(int a[],int n){
    for(int i=0;i<n;++i){
        printf("%d ",a[i]);
    }
}


int main () {
    int a[]={2,9,7,6,5,8};
    int n=sizeof(a)/sizeof(a[0]);
    heapSort(a,n);
    return 0;
}