【问题标题】:Why we divide arrays till one element in merge sort为什么我们在归并排序中将数组划分为一个元素
【发布时间】:2016-05-31 10:45:59
【问题描述】:

我正在阅读合并排序算法。我有一个问题

假设我们有以下列表

列表 = 5 4 1 3 6 8 9 7

首先将列表分成 4 个 -4 个元素。我们称左右侧列表

5 4 1 3 and 6 8 9 7

然后将 5 4 1 3 分成如下

5 4 and 1 3

然后把5和4分成

5 4

排序时,我们将从最后一步开始排序,一直到第 1 步(我们有 4-4 个元素)

问题:无论如何,当我们将列表划分为 1-1 个元素并且我们随时对列表进行排序和合并时,为什么不只将列表划分为 4-4 个元素。因为在这种情况下,我们也会合并列表。为什么要迭代到 1-1 个元素

【问题讨论】:

  • 基本情况发生在当前迭代有一个或两个元素时。发生这种情况时,算法将返回单个元素,或对两个元素进行就地排序。这假设您正在使用合并排序的递归实现,我假设您是。
  • 因为只有一个元素的数组已经排好序了。
  • 为了澄清 Tim Biegeleisen 的评论,合并排序的自下而上/迭代实现跳过了数组的所有递归拆分,并假设大小为 N 的数组是大小为 1 的 N 个子数组。大多数现实世界的合并排序实现都是自下而上合并排序的一些变体,例如timsort

标签: algorithm sorting merge


【解决方案1】:

1-元素列表自然排序。 我们将两个 1 元素排序列表合并为 2 元素排序列表,然后将 2 元素排序列表合并为 4 元素排序列表,依此类推。

合并过程适用于排序列表,因此我们不能将合并应用于未排序的 5 4 1 36 8 9 7 列表

【讨论】:

    【解决方案2】:

    理论上,这是因为合并过程需要采用两个排序列表。 一个 4 元素的列表不排序,而一个元素的列表是。

    在实践中,我们不会将列表拆分为一个元素。因为归并排序不是小列表最有效的排序算法,所以插入排序才是。所以常见的优化是用插入排序对小列表进行排序,再用归并排序合并。

    【讨论】:

      【解决方案3】:

      因为如果您以合并排序方式进行操作,则存在一个表示合并列表(拆分后)已排序的不变量,这意味着在合并拆分列表后的每个级别,合并列表都是有序的。

      例如,如果您在拆分为 4-4 后立即合并,则会比较两个列表的第一项,而这两个值可能都不是这些拆分列表的最小值,这意味着您最终会得到一个结果排序很可能未排序的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多