希尔排序:设定一个元素间隔增量gap,将序列按照间隔数gap从第一个元素开始依次分成若干个子序列,在子序列中运用排序方法(如冒泡排序法),然后缩小增量gap重新将整个序列按照新的间隔数gap进行操作,再对每个子序列进行排序,直到间隔数为1为止。
如何选取gap值:经验表示gap取值为序列长度的一半,后一趟排序的gap取值为前一趟gap取值的一半即可。
例如序列“5,30,7,9,20,10”操作步骤如下:
代码如下:
#include<stdio.h>
void ShellSort(int a[],int n)
{
int i,j,temp;
int flag,gap=n;
while(gap>1)
{
gap=gap/2; //每次减半
flag=1;
while(flag)
{
flag=0;
for(i=0;i<n-gap;i++)
{
j=i+gap;
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
flag=1;
}
}
}
}
}
void main()
{
int a[10],i;
printf("please input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("The array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
ShellSort(a,10);
printf("\nAfter sort the array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
printf("\n");
}