您的位置:首页 > 其它

希尔排序算法

2016-01-14 16:34 183 查看


希尔排序

排序,希尔排序,ShellSort

希尔排序有是又称为缩小增量排序。希尔排序通过一定的间隔(增量)将待排序序列分成个子序列(分组),再个子序列进行插入排序,通过不断缩小间隔的大小,最终实现原序列的排序。

希尔排序使用一个序列{h1,h2,…,hk}(叫做增量序列)对待排序序列进行分割。

比如含有10个键值的待排序序列{7,9,2,5,6,1,3,30,28,17}存储于数组a[]中。
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
7925613302817
第一次 取 h = 10/2 = 5;此时分组为:
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
7925613302817
组1组2组3组4组5组1组2组3组4组5
对每一组的序列进行排序后(使用插入排序):
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
1325679302817
组1组2组3组4组5组1组2组3组4组5
第二次 取 h /=2 = 5/2 = 2(向0取整),从新分组:
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
1325679302817
组1组2组1组2组1组2组1组2组1组2
再次对每一组的序列进行排序:
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
1325679172830
组1组2组1组2组1组2组1组2组1组2
再取 h /=2 = 2/2 = 1 , 分组:
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
1325679172830
组1组1组1组1组1组1组1组1组1组1
可以看到h = 1 时的排序其实就是对整个序列进行插入排序,由于已经现在的序列是一个很好的预排序序列,最后的插值排序算法速度是非常快的。
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
1235679172830
组1组1组1组1组1组1组1组1组1组1
下面是《数据结构与算法-C语言描述》中的实现,可以看到代码第8~14行就是直接插入排序算法。

// 希尔排序 (缩小增量排序) 

void ShellSort(ElementType a[], int N) 



    int i, j, Increment; 

    ElementType temp; 

    for (Increment=N/2; Increment>0; Increment/=2) 

    { 

        for (i=Increment; i<N; i++) 

        { 

            temp = a[i]; 

            for (j=i; j>=Increment && a[j-Increment]>temp; j-=Increment) 

                a[j] = a[j-Increment]; 

            a[j] = temp; 

        } 

    } 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: