先贴出几个我认为很有参考价值的网址:
http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/shell.htm
http://blog.youkuaiyun.com/21aspnet/article/details/7199579
大概是明白“希尔排序”最初版本的操作方法了,举个简单的例子来看看这个算法的过程。
假设一个数组里面有15个数字:1,99,635,23,100,39,123,234,345,2,232,10,299,934,35(注:|||是分隔符)
第一趟排序,gap = 7。
分组情况:1 99 636 23 100 39 123 ||| 234 345 2 232 10 299 934 ||| 35
完成之后:1 99 2 23 10 39 123 ||| 35 345 635 232 100 299 934 ||| 234
分隔单位中的每一位相对于别的分隔单位已经有序,如 1 35 234 和 99 345 和 2 635以此类推
第二趟排序,gap = 3。
分组情况:1 99 636 ||| 23 100 39 ||| 123 234 345 ||| 2 232 10 ||| 299 934 35
完成之后:1 10 2 ||| 23 35 39 ||| 123 99 100 ||| 299 232 234 ||| 635 934 345
第三趟排序,gap = 1。
分组情况:数组中每个元素自己一组
完成之后:1 2 10 23 35 39 99 100 123 232 234 299 345 635 934
看别的博客说此时退化成了“快速排序”(又是个陌生的东西,哎,算法白学了)?不清楚,暂时就这样子理解:分组之后,分隔单位对应位置有序,然后划分地更细,逐渐排好序……
我认为希尔排序的代码还是很神奇的,真不知道前人是怎样想出来这个算法并实现的,点个赞先
对了,忘记贴代码了。
#include <stdio.h>
#include <stdlib.h>
void shellSort(int *,int);
void printfV(int *,int);
int main()
{
int v[] = {1,99,635,23,100,39,123,234,345,2,232,10,299,934,35};
int num = sizeof(v)/sizeof(int);
printf("total number is %d\n",num);
shellSort(v,num);
printf("The last result is:\n");
printfV(v,num);
return 0;
}
void shellSort(int *v,int n)
{
int i,j,gap,tmp;
for(gap = n/2; gap > 0; gap /= 2)
{
for(i = gap; i < n; i++)
{
for(j = i - gap; j >= 0 && *(v+j) > *(v+j+gap); j -= gap)
{
tmp = *(v+j);
*(v+j) = *(v+j+gap);
*(v+j+gap) = tmp;
}
}
printfV(v,n);
}
}
void printfV(int *v,int n)
{
int i;
for(i = 0; i < n; i++)
printf("%-5d",*(v+i));
printf("\n");
}