希尔(Shell)排序的理解

xiaoxiao2021-02-27  299

每一次描述也是一次对自己思维的梳理。记录一下对希尔排序的简单理解。通俗点来说,希尔排序就是将一组元素将相隔一定增量的元素抽取出来划为一组,再把这一组里面的元素进行直接插入排序,一般增量的递减次数每次缩小一半,直至为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,再用上面的循环去希尔排序,试验了之后,这样的确快了很多。

这个排序也还是很快的,是直接插入排序的优化版

转载请注明原文地址: https://www.6miu.com/read-4642.html

最新回复(0)