【发布时间】:2010-03-29 16:23:16
【问题描述】:
根据 Marcin Ciura 的Optimal (best known) sequence of increments for shell sort algorithm, shellsort 的最佳序列是 1, 4, 10, 23, 57, 132, 301, 701..., 但是我怎样才能生成这样的序列呢? 在 Marcin Ciura 的论文中,他说:
Knuth 和 Hibbard 的序列 相对较差,因为它们是 由简单的线性递归定义。
但我发现的大多数算法书籍都倾向于使用 Knuth 的序列:k = 3k + 1,因为它很容易生成。你用什么方法生成一个 shellsort 序列?
【问题讨论】:
-
有人挖出了我的序列 :-) 我正在对一个大小非常有限的数据集实施排序算法 - 大约 10 到 50,我发现 shellsort 是这个范围内最快的。我彻底搜索了最佳序列 - 发现主要是 Knuths、Sedgewicks 等,其中主要基于 voodoo 和 kumba wamba。 Marcin Ciuara 似乎是少数几个真正进行了一些基准测试并获得比基于神奇公式的序列更好的结果的人之一,这也是我将其发布在 OEIS 上的主要原因。但我没有给你答案。
-
该序列应该是严格递减的,并且它的最后一个元素总是1。如果gap为1,则表示经典的插入排序。所以 Ciura 的序列正确地是 [701, 301, 132, 57, 23, 10, 4, 1]。我做了一些测试,Shell 的原始序列对我来说表现更好。
-
您提供的链接已损坏。 “Shellsort 平均情况的最佳增量”:abstract 和 full paper
-
它是根据其他人所说的经验生成的,所以没有公式可以给出它们......但是我发现最接近的是
every following gap size is obtained by multiplying the previous gap size by 2.2(当然不完美) -
"...主要基于 voodoo 和 kumba wamba。"我喜欢!
标签: algorithm performance sorting shellsort