//sorts(排序conclusion)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*选择排序
(优化:每次与pos位置上的数比较,pos记录最大数的位置,最后交换位置)
int main()
{
int a[100],n,i,j,x;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n-1;i++)
{
for (j=i;j<n;j++)
{
if (a[i]<a[j])
{
x=a[i];
a[i]=a[j];
a[j]=x;
}
}
}
for (i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}*/
/*冒泡排序
(优化:用flag标记每轮变化,如果无变化则说明已经按顺序排列,无需继续进行)
int main()
{
int a[100],n,i,j,x;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i;j++)
{
if (a[j]<a[j+1])
{
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}
for (i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}*/
//*希尔排序(冒泡排序升级版)
int main()
{
int a[100]={0};
int n,i,step,flag,x,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
step=n/2;
flag=0;
t=1;
while (step>0)
{
if(!flag)
{
flag=1;
for(i=t;i<=n-step;i+=step)
{
if(a[i]>a[i+step])
{
x=a[i];
a[i]=a[i+step];
a[i+step]=x;
flag=0;
}
}
}
else
{
flag=0;
t++;
if (t==step+1)
{
t=1;
step=step/2;
}
}
}
for(i=1;i<=n;i++)
printf("%4d",a[i]);
printf("\n");
}
/*插入排序
int main()
{
int a[100]={0};
int n,i,t,temp;
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
for (i=2;i<n;i++)
{
t=i-1;
temp=a[i];
a[0]=temp;
while (temp<a[t])
{
a[t+1]=a[t];
t--;
}
a[t+1]=temp;
}
for (i=1;i<=n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
} */
/*快排
int n,a[100];
void sort(int left,int right)
{
int i,j,temp,x,t;
if (left>right)
return;
i=left;
j=right;
srand(time(0));
t=left+rand()%(right-left+1);
temp=a[t];
a[t]=a[left];
while(i<j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if (i<j)
{
x=a[i];
a[i]=a[j];
a[j]=x;
}
}
a[left]=a[i];
a[i]=temp;
sort(left,i-1);
sort(i+1,right);
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(0,n-1);
for (i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}*/