一.基本思想:
希尔排序是直接插入排序的转化,基本思想是将原始序列分成若干个子序列,分别进行直接插入排序,最后合并时使用一次直接插入排序。希尔排序划分子序列是根据增量来划分的,增量的确定方法没有确定的,增量数组dk[],一般使 n = n/3+1;
dk[i++] = n;直到n==1;
二.C语言代码实现:
#include <stdio.h>
int a[105],dk[105],n,m;
void shellInsert(int a[],int k)
{
int temp,j;
for(int i = k; i < n; i++)
{
if(a[i] < a[i-k])
{
temp = a[i];
for(j = i-k; j>=0&&temp<a[j]; j-=k)
a[j+k] = a[j];
a[j+k] = temp;
}
}
}
void shellSort(int a[],int dk[])
{
for(int i = 0; i < m; i++)
shellInsert(a,dk[i]);
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
m = 0;
int f = n;
do
{
f = f/3+1;
dk[m++] = f;
}while(f > 1);
shellSort(a,dk);
for(int i=0; i < n; i++)
printf("%d ",a[i]);
puts("");
}
return 0;
}