排序(4)希尔排序

来源:互联网 发布:msn软件 编辑:程序博客网 时间:2024/06/04 21:47

希尔排序又称为"缩小增量排序",是对插入排序的一种改进。

基本思想:设定一个元素间隔增量gap,将参加排序的序列按这个间隔数gap从第一个元素开始依次分成若干个子序列。在子序列中再用其他排序方法,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序。如此将“缩小增量gap——划分序列——将每个子序列排序”的操作进行下去,直到间隔数增量gap=1为止。


一般情况下,当增量gap缩小到1时,序列几乎都已经按值有序,不需要进行较多的元素移动就能达到排序的目的。


如何选取gap值? 常用且效果很好的gap值取法:首先gap取值为序列长度的一半。而在后续的排序过程中,后一趟排序的gap取值为前一趟排序gap取值的一半即可。


算法描述:

void shellsort(keytype k[],int n) {int i,j,flag,gap=n;keytype tmp;while(gap>1) {gap =gap/2;do {flag=0;for(i=1;i<=n-gap;i++) {j=j+gap;if(k[i]>k[j]) {tmp = k[i];k[i]=k[j];k[j]=tmp;flag=1;}}}while(flag!=0);}}


参考点击打开链接