此种方法有缺陷
- 缺点:
此种方法是先按照dk=n/2排序的,然后再按照1排序的此种方法是先按照dk=n/2排序的,然后再按照1排序的,如果顺序反过来,2个结果是一样的,WA - 原因:数组改变了
- 解决方法:再设置另一个数组,保存所给的数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n,a[10010],b[10010];
void shell(int dk)//dk表示增量
{
int i,j,t;
for(i=dk;i<=n-1;i++)
{
t=a[i];
for(j=i;j>=dk&&a[j-dk]>t;j-=dk)//j>=dk???
a[j]=a[j-dk];
a[j]=t;
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
int main()
{
while(~scanf("%d",&n))
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
shell(n/2);
shell(1);
}
return 0;
}
改进版
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n,a[10010],b[10010];
void shell(int a[],int dk)//dk表示增量 //改进
{
int i,j,t;
for(i=dk; i<=n-1; i++)
{
t=a[i];
for(j=i; j>=dk&&a[j-dk]>t; j-=dk) //j>=dk???
a[j]=a[j-dk];
a[j]=t;
}
for(i=0; i<n-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
int main()
{
while(~scanf("%d",&n))
{
int i;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];//改进
}
shell(a,n/2);//改进
shell(b,1);//改进
}
return 0;
}