希尔排序又称为"缩小增量排序",是对插入排序的一种改进。
基本思想:设定一个元素间隔增量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);
}
}