您的位置:首页 > 运维架构 > Shell

希尔(Shell)排序的理解

2017-05-04 16:12 141 查看
每一次描述也是一次对自己思维的梳理。记录一下对希尔排序的简单理解。通俗点来说,希尔排序就是将一组元素将相隔一定增量的元素抽取出来划为一组,再把这一组里面的元素进行直接插入排序,一般增量的递减次数每次缩小一半,直至为1,排序就完成了。

举个例子,比如3,30,18,250,10,12,8,2,1,4这10个元素,先除以2,得到初始增量为5,那么3,12为一组,30,8为一组等等。在组内直接插入排序。

那么下一次增量值为2,又形成了若干组,再进行直接插入排序,依次类推,直到增量为1排完序后就得到了有序的数组

下面贴上代码

public void sort(int[] a){
int len=a.length,j=0;
for(int gap=len/2;gap>0;gap/=2){
for(int i=gap;i<len;i++){
int temp=a[i];
j=i-gap;				//由于i是从gap开始的,所以i-gap为获取group之前与它相隔gap的元素
while(j>=0&&temp<a[j])//循环条件中用当前元素与j对应的元素比较
{
a[j+gap]=a[j];
j-=gap;
}
a[j+gap]=temp;
}
}

每个组内部的插入排序理解起来很简单,那么很明显,增量序列对于希尔排序很重要,上面的增量序列就是5,2,1,但效率不高,图灵奖得主Knuth前辈研究出了一个很好的增量序列。公式是:3h+1,依次1,4,13,40,121,.......,这样就可以先求出适合于数组大小的增量初始值gap,再用上面的循环去希尔排序,试验了之后,这样的确快了很多。

这个排序也还是很快的,是直接插入排序的优化版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: