希尔排序

插入排序的一个不错改进。与梳排序类似,希尔排序也用到gap的概念。

基本思路是:将原先的一行元素以gap为分界分成几段排成几行,然后按列来用插入排序。不断缩小gap直至1.

代码中用到的一个小优化是维基上看到的,据说此比率效率较高,由Knuth提出。

另外,还有一个优化基于下面的观察。

按照常规思路来说,对于每一个gap,我们应该分别对每一列来做插入排序。但是很显然,不同列之间是不会相互干扰的,因此,在代码中直接从第一列第二个元素开始递增,不断做插入排序。相邻的元素位于不同的列,因此它们并不会影响到彼此,对于同一列的元素,在这一列两个元素之间做了其他什么运算并没影响。这样写代码更加简洁。

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);
            }
        }
    }
}
Java
原文地址:https://www.cnblogs.com/7hat/p/3381414.html