#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int n;
int a[maxn];
void Swap( int &a,int &b )
{
int temp = a;
a = b;
b = temp;
}
// 从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
void MinHeapFixdown( int a[], int i, int n )
{
int j, temp;
temp = a[i];
j = 2 * i + 1;
while( j < n )
{
if ( j + 1 < n && a[j + 1] < a[j] ) //在左右孩子中找最小的
j++;
if ( a[j] >= temp )
break;
a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点
i = j;
j = 2 * i + 1;
}
a[i] = temp;
}
/*
void MinHeapFixup(int a[], int i)
{
for (int j = (i - 1) / 2; (j >= 0 && i != 0)&& a[i] > a[j]; i = j, j = (i - 1) / 2)
Swap(a[i], a[j]);
}
*/
//建立最小堆
void MakeMinHeap( int a[], int n )
{
for ( int i = n / 2 - 1; i >= 0; i-- )
MinHeapFixdown( a, i, n );
}
void MinheapsortTodescendarray( int a[], int n )
{
for ( int i = n - 1; i >= 1; i-- )
{
Swap( a[i], a[0] );
MinHeapFixdown( a, 0, i );
}
}
int main()
{
freopen("data.in","r",stdin);
int t;
scanf("%d",&t);
while( t-- )
{
scanf("%d",&n);
for( int i = 0; i < n; i ++ )
scanf("%d",&a[i]);
MakeMinHeap( a,n );
MinheapsortTodescendarray( a,n );
for( int i = 0; i < n-1; i ++ )
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}