一个在个人测试中表现比Sedgewick更好的希尔排序增量序列

        很多人应该都接触过希尔排序,这是一个常见的排序算法,为插入排序的优化版,效率和增量序列的选取有很大的关系。前阵子心血来潮,又稍微翻了一下很久以前学的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。

        以下是代码。


                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值