插入排序的一个不错改进。与梳排序类似,希尔排序也用到gap的概念。
基本思路是:将原先的一行元素以gap为分界分成几段排成几行,然后按列来用插入排序。不断缩小gap直至1.
代码中用到的一个小优化是维基上看到的,据说此比率效率较高,由Knuth提出。
另外,还有一个优化基于下面的观察。
按照常规思路来说,对于每一个gap,我们应该分别对每一列来做插入排序。但是很显然,不同列之间是不会相互干扰的,因此,在代码中直接从第一列第二个元素开始递增,不断做插入排序。相邻的元素位于不同的列,因此它们并不会影响到彼此,对于同一列的元素,在这一列两个元素之间做了其他什么运算并没影响。这样写代码更加简洁。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void shellSort(int[] A){ int gap = 1; while(gap < A.length/3) //by Knuth gap = gap * 3 + 1; for(; gap >= 1; gap /= 3){ for(int i = gap; i < A.length; i ++){ for(int j = i-gap; j >= 0 && A[j] > A[j+gap]; j -= gap){ swap(A, j, j+gap); } } } }