很多人应该都接触过希尔排序,这是一个常见的排序算法,为插入排序的优化版,效率和增量序列的选取有很大的关系。前阵子心血来潮,又稍微翻了一下很久以前学的C和算法之类的东西,再次注意到了这个希尔排序。
不少文章中都说不互质的增量序列效率极低,因而,我就想到了能不能构建一个纯素数的增量序列,来保证所有增量都必定互质。于是我用素数筛筛出素数作为增量序列。然而存在于自然数中的素数实在太多,全部选取作为增量是不切实际的(在测试中效率奇低无比)。所以,就需要隔若干个素数选取一个加入增量序列,而且这个间隔需要逐渐加大。
之后,我测试了很多种间隔序列,有nx,x^n,n^x(n为常数x为增量),其中,n^x型表现最佳,在个人测试中取n=3.5时效率最高。作为对比,我在网上进行了一番搜索,找到的增量序列中,被推荐最多(在测试中也确实比其他搜索到的序列更好)的就是Sedgewick(大部分包括Sedgwick都很眼熟,很久以前应该写过)。我尽可能地控制变量以进行公平比对——都是在同一台渣笔记本上运行,关闭了大部分会活动的后台,在一个C程序中,从输入文件读取10^7个随机产生的0~2.1*10^9的整数,让一个希尔排序函数分别使用两个不同的增量序列去排序这些整数,排序完成后写到输出文件。最终,在几十次的测试中,我自己构建的这个增量序列表现始终比Sedgwick更好。读取-排序-输出,使用这个纯素数序列的耗时在7596~7819ms,Sedgewick为8123~8471ms。
以下是代码。