C语言写的Shell排序算法。
shell排序的思想是根据步长由长到短分组,进行排序,直到步长为1为止,属于插入排序的一种。
shell排序是对插入排序的一个改装,它每次排序把序列的元素按照某个增量分成几个子序列,对这几个子序列进行插入排序,然后不断的缩小增量扩大每个子序列的元素数量,直到增量为一的时候子序列就和原先的待排列序列一样了,此时只需要做少量的比较和移动就可以完成对序列的排序了.
下面用个例子更好的理解一下( ):
无序数列: 32, 43,56,99,34,8,54,76
1.首先设定gap=n/2=4于是分组 32,34 排序 32,34 43, 8 8, 43 56,54 54,56 99,76 76,99 数列变成 32,8,54,76,34,43,56,99 2.gap=gap/2=2 于是分组 32,54,34,56 排序 32,34,54,56 8,76,43,99 8,43,76,99 于是数列变成 32,8,34,43,54,76,56,99 3.gap=gap/2=1于是分组 32,8,34,43,54,76,56,99 排序 8,32,34,43,54,56,76,99 gap=1结束…… 相应的C语言代码引用K&R C程序设计一书中给出的代码 void shellsort(int v[], int n) { int gap, i, j, temp; 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) //比较相距gap的元素,逆序互换 { temp=v[j]; v[j]=v[j+gap]; v[j+gap]=temp; } }