希尔排序

希尔排序的描述

希尔排序(Shell Sort)名称源于它的发明者Donald Shell。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组算法便终止。
----摘自严蔚敏,吴伟民.数据结构(c语言版):清华大学出版社,1997.4

使用增量序列h1,h2,....,ht,其中h1=1,只要h1=1,任何增量序列都是可行的。每组队列使用插入排序算法。

希尔排序的分析

如下表展示希尔排序的升序排序:

原始数组 81 94 11 96 12 35 17 95 28 58 41 75 15
5排序后 35 17 11 28 12 41 75 15 96 58 81 94 95
3排序后 28 12 11 35 15 41 58 17 94 75 81 96 95
1排序后 11 12 15 17 28 35 41 58 75 81 94 95 96

希尔排序的运行时间依赖于增量序列的选取。最坏的情形时间复杂度是O(n*n)。一般增量序列的选择可以保证时间复杂度在n的2次方以下,例如Hibbard提出的增量序列可以保证希尔排序的最坏时间复杂度为O(n3/2)(n的二分之三次幂)。而在实践中可以取得更好的效果,所以希尔排序是时间复杂度为幂次方级别中效果更好的排序方法

希尔排序升序排序的代码

public void shellSort(int[] arr){
    for (int gap = arr.length/2; gap > 0; gap /= 2){//产生增量序列
        //增量分组进行插入排序
        for (int i = gap; i < arr.length; i++){
            int j = i;
            int tmp = arr[i];
            for (; j >= gap && arr[j - gap] > tmp; j -= gap){
                arr[j] = arr[j - gap];
            }
            arr[j] = tmp;
        }
    }
}

你可能感兴趣的:(希尔排序)