【问题标题】:Sort an array which is partially sorted对部分排序的数组进行排序
【发布时间】: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


    【解决方案1】:

    除非它们已经完全排序(当然,可能以向下开始),否则任何数字序列都会上下波动等等。您可以遍历序列,注意它改变方向的点,然后对序列进行合并排序(反向读取反向序列)

    一般来说,复杂度是 N log N,因为此时我们不知道它是如何排序的。如果它的排序适中,即方向变化较少,则需要的比较较少。

    【讨论】:

    • 鉴于开场问题明确指出数据是部分排序的,我认为我们需要对其进行量化以远离 n log(n)。最简单的方法是计算分区/方向变化,我们可以称之为 p。在这种情况下,复杂度变为 p log(p)。如果 n 与 p 成正比,例如p = n / K 其中 K 是常数,虽然排序会更快,但从技术上讲复杂度仍然是 n log(n)。如果 p > n/2 则不满足数据部分排序的前提条件。
    • 如果我们知道其部分排序的性质,那么我们可以,但我们没有被告知这一点。鉴于规范只是说有些区域上升然后其他区域下降,我们对它的排序性一无所知,并且任何数据序列都符合规范。因此,要么一般来说没有比 O(N log N) 更好的算法,要么,如果你非常聪明并想出了一个,你就会载入史册,因为这将是一个通用的排序算法!
    • 就像我很想载入史册一样,通用 O(n) 排序已经存在了一段时间,但在许多情况下占用了太多空间。不过,对于给出的示例数据,鸽巢分类可以很好地工作,请参阅en.wikipedia.org/wiki/Pigeonhole_sort 有时您需要寻求对规范的澄清,而不是把它当作福音。这个问题是根据部分排序的数据专门提出的,所以我希望在答案中量化并利用这一点,
    【解决方案2】:

    您可以找到更改/分区点,并在分区对之间执行合并排序。这将利用现有的排序,因为通常合并排序从元素对开始。

    编辑只是想弄清楚这里的复杂性。合并排序是 n log(n),其中 log(n) 与您必须重新分区的次数有关。首先是每对元素,然后是每对元素,等等……直到达到数组的大小。在这种情况下,您有 n 个具有 p 个分区的元素,其中 p

    【讨论】:

    • 在类似的线路上,我认为 1) 注意方向变化的所有点。 2)我们可以通过反转它轻松地将递减序列更改为递增序列,对于序列中的 n 个元素将采用 O(n)。 3)现在我们有一个数组,每个元素只改变一个方向。 4)注意到这些我们可以应用合并
    • 任何指向合并排序示例实现的指针,有效地处理内存移动次数和额外内存?
    • 谷歌搜索合并排序提供了大量示例。我通常会使用数组,我的偏好是就地排序并使用迭代而不是递归。对于提出的问题,这非常简单。找到两个相邻的正向和反向序列。将它们合并为一个正向序列。对数组中的所有序列对重复。从数组开始重复,直到没有更多的序列。就地合并只是将元素从一个序列交换到下一个序列,其中第二个序列上的光标元素小于第一个序列上的光标元素。
    【解决方案3】:

    【讨论】:

    【解决方案4】:

    如果您知道数据“几乎已排序”并且集合大小相当小(例如可以由 16 位整数索引的数组),那么Shell 可能是您的最佳选择。是的,它的基本时间复杂度为 O(n^2)(可以通过用于间隙大小调整的序列减少到当前最坏情况的 O(n*log^2(n))),但是性能随着输入集的排序而提高,在已经排序的集上达到 O(n) 的最佳情况。在输入未按预期排序的情况下,使用 Sedgewick 的间隙大小序列将提供最佳性能。

    【讨论】:

      【解决方案5】:

      Strand Sort 可能与您要查找的内容很接近。平均情况 O(n sqrt(n)),最佳情况 O(n)(列表已排序),最坏情况 O(n^2)(反向排序)。

      分享和享受。

      【讨论】:

        猜你喜欢
        • 2012-07-04
        • 2017-02-24
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 1970-01-01
        相关资源
        最近更新 更多