【发布时间】:2011-04-28 12:12:23
【问题描述】:
我正在尝试对具有以下属性的数组进行排序
它在一定程度上增加然后开始减少,然后增加然后减少等等。是否有任何算法可以通过使用部分排序来以低于 nlog(n) 的复杂度对其进行排序?
数组示例 = 14,19,34,56,36,22,20,7,45,56,50,32,31,45.........最多 n
提前致谢
【问题讨论】:
标签: c arrays sorting complexity-theory
我正在尝试对具有以下属性的数组进行排序
它在一定程度上增加然后开始减少,然后增加然后减少等等。是否有任何算法可以通过使用部分排序来以低于 nlog(n) 的复杂度对其进行排序?
数组示例 = 14,19,34,56,36,22,20,7,45,56,50,32,31,45.........最多 n
提前致谢
【问题讨论】:
标签: c arrays sorting complexity-theory
除非它们已经完全排序(当然,可能以向下开始),否则任何数字序列都会上下波动等等。您可以遍历序列,注意它改变方向的点,然后对序列进行合并排序(反向读取反向序列)
一般来说,复杂度是 N log N,因为此时我们不知道它是如何排序的。如果它的排序适中,即方向变化较少,则需要的比较较少。
【讨论】:
您可以找到更改/分区点,并在分区对之间执行合并排序。这将利用现有的排序,因为通常合并排序从元素对开始。
编辑只是想弄清楚这里的复杂性。合并排序是 n log(n),其中 log(n) 与您必须重新分区的次数有关。首先是每对元素,然后是每对元素,等等……直到达到数组的大小。在这种情况下,您有 n 个具有 p 个分区的元素,其中 p
【讨论】:
【讨论】:
如果您知道数据“几乎已排序”并且集合大小相当小(例如可以由 16 位整数索引的数组),那么Shell 可能是您的最佳选择。是的,它的基本时间复杂度为 O(n^2)(可以通过用于间隙大小调整的序列减少到当前最坏情况的 O(n*log^2(n))),但是性能随着输入集的排序而提高,在已经排序的集上达到 O(n) 的最佳情况。在输入未按预期排序的情况下,使用 Sedgewick 的间隙大小序列将提供最佳性能。
【讨论】:
Strand Sort 可能与您要查找的内容很接近。平均情况 O(n sqrt(n)),最佳情况 O(n)(列表已排序),最坏情况 O(n^2)(反向排序)。
分享和享受。
【讨论】: