程序代码:

#include<iostream>
#define MAX 1000
using namespace std;
void Sift(int* r,int size,int i);
void swap(int *num,int i,int j);
int main()
{
    int num[MAX];
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>num[i];
    for(i=(n+1)/2;i>0;i--)
        Sift(num,n,i);
    for(i=n;i>1;i--)
    {
    swap(num,1,i);
    Sift(num,i-1,1);
    }   
    for(i=1;i<=n;i++)
        cout<<num[i]<<' ';  
    return 0;
}
void swap(int *num,int i,int j)
{
    int tmp =  num[i];
    num[i]= num[j];
    num[j]= tmp;
}

void Sift(int* r,int size,int i)//调整节点i
{

    int j=2*i;//节点i的左儿子
    int temp;
    while(j<=size)
    {
        temp = r[i];
        if(j<size&&r[j]<r[j+1])
            j++;
        if(temp<r[j])
        {
            r[i]=r[j];
            r[j]=temp;
            i=j;         //继续向下调整
            j=2*i;          
        }   
        else
            break;
    }   
}

运行结果:

排序前:

排序后: