//冒泡排序在于将每一次的最大(升序)不断沉底,只要当一轮比较中没有发生交换,那么就是已经有序
#include<cstdio>
#include<iostream>
using namespace std;
int a[100000];
void print(int n)
{
for(int i=1; i<=n; i++)
printf("%d ",a[i]);
printf("\n");
}
void init(int n)
{
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
}
//普通版冒泡排序
void popsort(int n)
{
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (a[i] > a[j])
swap(a[i],a[j]);
}
}
}
//普通优化版冒泡排序
void popsort1(int n)
{
bool flag=false;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (a[i] > a[j])
{
flag=true;
swap(a[i],a[j]);
}
}
if(flag==false)
return ;
}
}
//加强优化版冒泡排序
void popsort2(int n)
{
int lastchange=n,k=0;
while(lastchange)
{
k=lastchange;
lastchange=0;
for(int j=1; j<k; j++)
{
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
lastchange=j;
}
}
}
}
int main()
{
int n;
while(cin>>n)
{
init(n);
// popsort(n);
// popsort1(n);
popsort2(n);
print(n);
}
return 0;
}