【问题标题】:What is the formula to get the number of passes in a shell sort?获得shell排序通过次数的公式是什么?
【发布时间】:2020-06-18 14:50:55
【问题描述】:

我指的是原始(Donald Shell 的)算法。我正在尝试基于 shell 排序进行主观排序。我已经做了所有的逻辑,它与 shell 排序完全相同,但不是计算机计算什么更大,而是用户主观地确定什么更大。但我想向用户显示一个百分比或其他东西,让用户知道它已经排序了多远。这就是为什么我想找到一种方法来了解它。

在 shell 排序中获得通过次数的公式是什么?我注意到这个数字不是固定的,那么最小值和最大值是多少? N和N^2?或者,如果您知道如何以最佳方式显示排序进度,我将不胜感激。

PS:不是比较次数的问题!也与时间复杂度无关。我的问题是关于数组中的传递次数。

我做了这个公式,用颜色显示它。但它不适用于正确的范围。

List<Color> colors = [
    Color(0xFFFF0000),//red
    Color(0xFFFF5500),
    Color(0xFFFFAA00),
    Color(0xFFFFFF00),//yellow
    Color(0xFFAAFF00),
    Color(0xFF00FF00),
    Color(0xFF00FF00),//green
  ];
[...]
style: TextStyle(
                          color: colors[(((pass - 1) * (colors.length - 1)) /
                                  sqrt(a.length).ceil())
                              .floor()]),
[...]

【问题讨论】:

  • 定义“不工作”。显示您的代码并解释问题。时间复杂度取决于算法,而您没有向我们展示您的。
  • 我很惊讶搜索 shell 排序的计算复杂性 并没有让您找到问题的答案。或者,如果您一直在搜索其他术语,请尝试使用该术语。
  • 是的,我指出的“时间复杂度”是另一个,尽管它更多的是对需要多少次重复的总结,而不是时间的指示(单个重复可能被严重编码为非常慢! ) - 幸运的是,这听起来像是 OP 正在寻找的。​​span>
  • @High Performance Mark 时间复杂度是指比较次数。但我的意思是它通过数组的次数,而不是多少次比较或它的时间复杂度。
  • @underscore_d 我想我没有很好地解释自己,所以你无法理解我的意思。我编辑了问题,请查看它。

标签: sorting math dart shellsort


【解决方案1】:

因为一次pass是gap序列的一个元素的应用,所以pass的次数取决于使用的gap序列。

如果您使用 Shell 的原始间隙序列的 2 次方,则通过次数大约是输入大小的二进制对数。

您可以在关于 Shell Sort 的维基百科文章中阅读更多关于其他建议的间隙序列的信息:https://en.wikipedia.org/wiki/Shellsort

【讨论】:

  • 谢谢。是的,我指的是原始(Donald Shell 的)算法。我正在尝试基于 shell 排序进行主观排序。我已经做了所有的逻辑,它与 shell 排序完全相同,但是不是计算机计算什么更大,而是用户主观地确定什么更大。但我想向用户显示一个百分比或其他东西,让用户知道它已经排序了多远。这就是为什么我想找到一种方法来了解它。
  • 是的!我使用了 log2(n),它工作得很好!它显示了基于通行证的排序进度。我尝试了几个随机生成的数字和列表大小,直到现在一切正常。我基本上使用了这种交叉乘法,将进度与从红色到绿色的颜色联系起来。颜色[(((pass - 1) * (colors.length - 1))/(log(a.length) / log(2)).floor()).floor()])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2019-05-06
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
相关资源
最近更新 更多