#include<stdio.h>
typedef 
int elemtype;
void Adjust(elemtype r[], int k, int n);
void HeapSort(elemtype r[], int n);

int main()
{
    
int i, m;
    elemtype r[
1000];
    
while (1)
    
{
        scanf(
"%d"&m);
        
if (m == 0)
        
{
            
break;
        }

        
for (i = 1; i <= m; i++)
        
{
            scanf(
"%d"&r[i]);
        }

        HeapSort(r, m);
    }

    system(
"pause");
    
return 0;
}

void Adjust(elemtype r[], int k, int n)//这里对数组进行升序排序 
{
    
int i, j;
    elemtype tmp;
    tmp 
= r[k];
    i 
= k;
    
while (i * 2 <= n)//在有孩子的情况下遍历孩子。tmp是当前结点值,它保持不变 
    {
        j 
= 2 * i;
        
if (j + 1 <= n && r[j+1> r[j])//找出左右孩子中的较大者childLarger 
        {
            j
++;
        }

        
if (tmp < r[j])
        
{
            r[i] 
= r[j];//如果结点比childLarger小,将孩子上移到结点 
            i = j;//将下标移指向childLarger的位置 
        }

        
else
        
{
            
break;//表明i指向的结点的孩子都比tmp小 
        }

    }

    r[i] 
= tmp;
}

void HeapSort(elemtype r[], int n)
{
    
int i, j;
    elemtype tmp;
    
for (i = n / 2; i >= 1; i--)//把树调整成大顶堆 
    {
        Adjust(r, i, n);
    }

    printf(
"\n\n大顶堆============================\n"); 
    
for (j = 1; j <= n; j++)
    
{
        printf(
"%d ", r[j]);
    }

    printf(
"===================================\n");    
    
for (i = n; i >= 2; i--)
    
{
        tmp 
= r[i];
        r[i] 
= r[1];
        r[
1= tmp;
        Adjust(r, 
1, i - 1);//i - 1目的是不让Adjust把i上移,因为r[i]是r[1]到r[i]中的最大值 
        printf("\n-------------------------------------\n");
        
for (j = 1; j <= n; j++)
        
{
            printf(
"%d ", r[j]);
        }

    }

}


/*
11
1 3 2 5 11 7 4 13 19 6 9
*/