#include <stdio.h>
#include <stdlib.h>
#define M 30
/*算法思想:
对数据进行按一定规则不断分组,在每一组利用直接插入排序进行排序的基础上,实现Shell插入排序;
具体操作:
对n个数据进行排序,首先取1个正整数d<n,将这n个数记录分为d组,即每相距为d的数据为一组;
然后对这组数据进行直接插入排序,不断进行这个操作直至d=1结束
*/
/*Shell插入排序函数:比直接插入排序效率高*/
void shellinsertsort(int a[],int len) /*对len 个数据进行希尔插入排序*/
{
int d,i,j,t;
for(d=len/2;d>=1;d=d/2) /*d的取法多种多样*/
{
for(i=(0+d);i<len;i++){
t=a[i];
for(j=i-d;j>=0&&a[j]>t;j=j-d){
a[j+d]=a[j];
}
a[j+d]=t;
}/*当d=1时,同直接插入排序一样*/
}
{ printf("希尔插入排序:\n");
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int x,a[M],i=0,len;
printf("Input numbers end by -1:\n");
scanf("%d",&x);
while(x!=-1)
{
a[i]=x;i++;scanf("%d",&x);
}
len=i;
shellinsertsort(a,len);
print(a,len);
return 0;
#include <stdlib.h>
#define M 30
/*算法思想:
对数据进行按一定规则不断分组,在每一组利用直接插入排序进行排序的基础上,实现Shell插入排序;
具体操作:
对n个数据进行排序,首先取1个正整数d<n,将这n个数记录分为d组,即每相距为d的数据为一组;
然后对这组数据进行直接插入排序,不断进行这个操作直至d=1结束
*/
/*Shell插入排序函数:比直接插入排序效率高*/
void shellinsertsort(int a[],int len) /*对len 个数据进行希尔插入排序*/
{
int d,i,j,t;
for(d=len/2;d>=1;d=d/2) /*d的取法多种多样*/
{
for(i=(0+d);i<len;i++){
t=a[i];
for(j=i-d;j>=0&&a[j]>t;j=j-d){
a[j+d]=a[j];
}
a[j+d]=t;
}/*当d=1时,同直接插入排序一样*/
}
}
/*输出结果函数*/
void print(int a[],int len){ printf("希尔插入排序:\n");
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int x,a[M],i=0,len;
printf("Input numbers end by -1:\n");
scanf("%d",&x);
while(x!=-1)
{
a[i]=x;i++;scanf("%d",&x);
}
len=i;
shellinsertsort(a,len);
print(a,len);
return 0;
}
/*执行结果如图:*/