【问题标题】:What is the running time of comb sort?梳状排序的运行时间是多少?
【发布时间】:2014-05-01 00:03:41
【问题描述】:

据我所知,Comb sort 也应该像 shell 排序一样在亚二次时间内运行。这是因为梳排序是冒泡排序,壳排序与插入排序的关系。 Shell 排序根据间隙序列应用插入排序对数组进行排序,类似地梳排序根据间隙序列应用冒泡排序对数组进行排序。那么梳排序的运行时间是多少呢?

【问题讨论】:

  • 根据 Wiki 文章中的参考资料,最坏的情况是二次的。这是否回答你的问题?因为如果不是,那么我认为你问错了问题
  • 一开始我没有注意到维基页面右侧的表格。但是,是的,它现在回答了我的问题。谢谢。
  • 梳排序很奇怪;注意平均情况,即“预期运行时间”。梳排序和快速/合并排序的经验基准很有趣;一个小家伙怎么能努力跟上?
  • 我比较了combsort for 5000 elements v/s combsort for 500 elements。虽然最坏的情况是二次的,但它的随机情况、执行时间、对大型数据集排序的实用性以及......它的简单性可能会让您感到惊讶。
  • @NiklasB。 :我认为你应该重写你的评论作为答案。所以将这个问题标记为已回答。

标签: arrays algorithm sorting big-o time-complexity


【解决方案1】:

按什么顺序递增?

如果增量选择为:所有小于 N 的 (2^p * 3^q) 形式的数字的集合,那么,是的,运行时间优于二次(它与 N 乘以 N 的对数的平方成正比)。使用组增量,Combsort完全执行与使用相同增量(“Pratt 序列”)的 Shellsort 相同的交换。但这并不是人们在谈论 Combsort 时通常想到的。

理论上...

随着增量呈几何级数递减(例如,在每次通过输入时,增量大约是前一个增量的 80%),这就是人们在谈论 Combsort 时通常所说的意思……是的,渐近地,它在最坏情况和平均情况下是二次方的。但是……

在实践中...

只要增量是互质的并且一个增量与下一个增量之间的比率是合理的(80% 很好),n 必须在 平均之前天文数字 > 运行时间将远远超过 n.log(n)。我使用 Combsort 一次对数亿条记录进行了排序,而且我只见过二次运行时间,这是我通过构建“杀手级输入”故意设计它们的。在实践中,对于相对质数的增量(以及相邻增量之间的比率为 1.25:1),即使对于数百万条记录,Combsort 平均需要的比较次数大约是合并排序的 3 倍,并且通常需要 2 到 3 倍的时间运行。

【讨论】:

    【解决方案2】:

    (这个问题已经有一段时间没有答案了,所以我将我的评论转换为答案。)

    虽然shell排序和梳排序有相似之处,但梳排序的平均运行时间是O(n2)。证明这一点有点棘手,我见过的用来证明它的技术是incompressibility method,这是一种涉及 Kolmogorov 复杂性的信息论技术。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2023-03-25
      相关资源
      最近更新 更多