大体思想:先把数据分组,按组先排几遍,然后最后一次进行插入排序
举例:以三个为一组
3 4 8 6 9 5 2 6 1 7
那就3 4 8为一组,6 9 5为一组,2 6 1为一组,7为一组。
先把每组的第一个元素进行排序变成
第一组:2 4 8,第二组:3 9 5,第三组:6 6 1,第四组:7
然后把每组的的第二个元素排序:
第一组:2 4 8,第二组:3 6 5,第三组:6 9 1,第四组没有第二个,不管
然后把每组的的第三个元素排序:
第一组:2 4 1,第二组:3 6 5,第三组:6 9 8,第四组没有第三个,不管
数组此时的顺序为:
2 4 1 3 6 5 6 8 9 7
然后再把分成两组:
2 4为一组,1 3为一组,6 5为一组,6 8为一组,9 7为一组;
先按每组的第一个元素进行排序:
1 4 2 3 6 5 6 8 9 7
再按每组的第二个元素进行排序:
1 3 2 4 6 5 6 7 9 8
最后再进行一次插入排序就好了
1 2 3 4 5 6 6 7 8 9
是不是非常的简单,非常的easy。
代码实现:
#include <stdio.h>
#include <stdlib.h>
void shellsort(int [],int n);
int main(void)
{
int sz[10] = {3,4,8,6,9,5,2,6,1,7};
shellsort(sz,10);
int i;
for(i = 0;i < 10;i++)
{
printf("%d ",sz[i]);
}
return 0;
}
void shellsort(int sz[],int n)
{
int ad = 3; //粗排以三个为一组
int i,j;
for(;ad >= 1;ad--) //排几次
{
for(i = 0;i < 10;i += ad) //对每组的每个元素进行排序
{
int k = i + ad; //下一组元素的下标
int temp = sz[k];
while(k >= 0 &&temp <sz[k-ad])
{
sz[k] = sz[k-ad];
k -= ad;
}
sz[k] = temp;
}
}
}