如何为shell排序选择子序列的长度?

时间:2018-03-10 12:52:08

标签: shellsort

假设我们有一个长度为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的序列进行“预排序”。正确?

问题:

  1. 现在,根据我们选择k_i的方式,我们可以获得更好的性能。我可以在这里使用一条规则来选择k_i吗?

  2. 我也可以选择例如n = 15,k_1 = 5,k_2 = 3,k_3 = 2?

  3. 如果我们有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}?

1 个答案:

答案 0 :(得分:1)

关于弹壳的一个有趣的事情是,对于一系列n(唯一)条目,将需要一组唯一的间隙来有效地对其进行排序,基本上f(n)=> {间隙/空隙}

例如,为了最有效 - 平均 - 对包含

的序列进行排序
  • 2-5个条目 - 使用插入排序
  • 6个条目 - 使用带有间隙{4,1}
  • 的shellsort
  • 7或8个条目 - 使用{5,1} shellsort
  • 9个条目 - 使用{6,1} shellsort
  • 10个条目 - 使用{9,6,1} shellsort
  • 11个条目 - 使用{10,6,1} shellsort
  • 12个条目 - 使用{5,1} shellsort

如您所见,6-9需要2个缺口,10个和11个需要3个和12个2个。这是典型的弹壳间隙:从一个n到下一个(即n + 1),你可以相当确定间隙的数量和构成会有所不同。

shellort的一个令人讨厌的副作用是当使用一组n个条目的随机组合(以节省处理/评估时间)来测试间隙时,你可能最终得到n个条目的最佳间隙或最佳间隙你的组合 - 很可能是后者。

我推测可能有可能创建算法,您可以插入任意n并获得为您计算的最佳间隙序列。许多备受瞩目的计算机科学家已经探索了n和间隙之间的关系而没有很多东西可以展示它。最终,他们产生的差距(或多或少通过反复试验)声称比其他探索过炮弹的人更好。

关于你的前言n = 16 ......

  • a {8,4,2,1} shellsort可能是也可能不是对16个条目进行排序的有效方法。
  • 或者它应该是三个缺口,如果是这样,它们可能是什么?
  • 甚至两个?

然后,(尝试)回答你的问题......

Q1:规则可以制定

Q2:你可以......但是你应该测试它(对于给定的n,有n个可能的序列要测试)

问题3:您可以将其与正确答案(上图)进行比较。或者你可以对抗所有10个! n = 10时可能的序列(其中有3628800个) - 可行