标签:算法
接上文。增量序列h有两条重要性质:
首先,定义h排序结束后的数组为h有序。
1、k排序一个h有序的数组,得到的数组既为k有序也为h有序。
2、当k、h互质时,对该新数组进行g排序,比较次数少于
下面是一个很不错的增量序列
更进一步,根据性质2,假如一个2有序且3有序的数组进行最后一遍排序(1排序),比较次数为线性。
1971年,pratt提出了一个增量三角形:
该图中每个数都是左上数的三倍,右上数的两倍。实际应用中,可以将{2,3}替换成较大的互质素数对{h,k},以减少序列项的数量。
以下是
8191 4095 2047 1023 511 255 127 63 31 15 7 3 1
shell sort step 321464
9841 3280 1093 364 121 40 13 4 1
shell sort step 387480
8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
shell sort step 1684506
16577 4193 1073 281 77 23 8 1
shell sort step 373642
对该数列进行增项训练,发现在1073和281之间插入一项541,能得到较好结果:
16577 4193 1073 541 281 77 23 8 1
shell sort step 318192
同理,对
9841 3280 1093 364 121 40 23 4 1
shell sort step 342600
由此想到如下改进:
首先固定
接着固定
依次类推,最后得到一个新的数列
4626 2171 969 383 175 65 23 5 1
shell sort step 269223
best step = 269223, val = 9251
此时,较原增量数列,已提高43%效率。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:算法
原文地址:http://blog.csdn.net/acrux1985/article/details/48000079