希尔排序算法也称为缩小增量算法;
算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,直接按照直接插入排序,排序完成。
代码实现:
//shell(希尔)排序——多次利用直接插入排序
//一趟希尔过程
static void Shell(int *arr,int len,int gap)//gap,组数或间隔,间隔是几,就是几组
{
//跟直接插入排序非常相似
int tmp;
int i;
int j;
for(i=gap;i<len;i++)
{
tmp=arr[i];
for(j=i-gap;j>=0;j-=gap)//从后往前找位置
{
if(arr[j]<=tmp)
{
break;
}
else
{
arr[j+gap]=arr[j];//移数据
}
}
arr[j+gap]=tmp;//放数据
}
}
void ShellSort(int *arr,int len)
{
int d[]={5,3,1};//gap
for(int i=0;i<sizeof(d)/sizeof(d[0]);i++)
{
Shell(arr,len,d[i]);
}
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[]={32,2,65,234,76,33,35,66,2,65,3,2,8,33,11};
ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
输出结果:32 2 65 2 2 2 2 2 2 65 2 2 8 33 11