希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,适合于数据量中等大小的排序(成千上万的数据量),同时该算法是冲破O(n^2)的第一批算法之一。
基本思想:分割成若干个较小的子文件,对各个子文件分别进行直接插入排序,当文件达到基本有序时,再对整个文件进行一次直接插入排序。
///希尔排序
///by HZQRomon
#include<stdio.h>
#define m 1000
void ShellSort(int *num, int n)
{
int increment = 1; //增量取值没有统一标准,必须小于待排序元素的个数,且最后一趟排序增量要为1
int i,j,temp;
for(increment = n/2; increment > 0; increment /= 2) //增量最后递减至1
{
for(i = increment; i < n; i++)
{
temp = num[i];
for(j = i-increment; j >= 0 && temp < num[j]; j -= increment)
{
num[j + increment] = num[j];
}
num[j + increment] = temp;
}
}
}
int main()
{
int n,i;
int a[m];
while(scanf("%d",&n)!=EOF)
{
int key = 0;
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
ShellSort(a,n);
for(i = 0; i < n; i++)
{
printf("%d%c",a[i],i==(n-1)?'\n':' ');
}
}
}