假设我们有一个长度为n的序列a_i,我们想用shell排序对它进行排序。为此,我们将选择a_i长度为k_i的子序列。
我现在想知道如何选择那些k_i。您通常会看到,如果n = 16,我们将选择k_1 = 8,k_2 = 4,k_3 = 2,k_4 = 1。因此,我们将成对比较每个k_i的数字,最后使用insertionSort来完成排序。
首先对长度为k_i的子序列进行排序的想法是对insertSort的序列进行“预排序”。正确?
问题:
现在,根据我们选择k_i的方式,我们可以获得更好的性能。我可以在这里使用一条规则来选择k_i吗?
我也可以选择例如n = 15,k_1 = 5,k_2 = 3,k_3 = 2?
如果我们有n = 10且k_1 = 5,我们现在可以使用{k_2 = 2,k_3 = 1}或{k_2 = 3,k_2 = 2,k_3 = 1}或{k_2 = 3 ,k_3 = 1}?
答案 0 :(得分:1)
关于弹壳的一个有趣的事情是,对于一系列n(唯一)条目,将需要一组唯一的间隙来有效地对其进行排序,基本上f(n)=> {间隙/空隙}
例如,为了最有效 - 平均 - 对包含
的序列进行排序如您所见,6-9需要2个缺口,10个和11个需要3个和12个2个。这是典型的弹壳间隙:从一个n到下一个(即n + 1),你可以相当确定间隙的数量和构成会有所不同。
shellort的一个令人讨厌的副作用是当使用一组n个条目的随机组合(以节省处理/评估时间)来测试间隙时,你可能最终得到n个条目的最佳间隙或最佳间隙你的组合 - 很可能是后者。
我推测可能有可能创建算法,您可以插入任意n并获得为您计算的最佳间隙序列。许多备受瞩目的计算机科学家已经探索了n和间隙之间的关系而没有很多东西可以展示它。最终,他们产生的差距(或多或少通过反复试验)声称比其他探索过炮弹的人更好。
关于你的前言n = 16 ......
然后,(尝试)回答你的问题......
Q1:规则可以制定
Q2:你可以......但是你应该测试它(对于给定的n,有n个可能的序列要测试)
问题3:您可以将其与正确答案(上图)进行比较。或者你可以对抗所有10个! n = 10时可能的序列(其中有3628800个) - 可行