【问题标题】:Number of comparisons in merge sort when list is already sorted列表已排序时合并排序中的比较次数
【发布时间】:2016-01-25 18:51:41
【问题描述】:

假设输入列表已经按升序排序。在这种情况下,比较的次数是多少。如果输入列表按元素数量倒序排序会怎样。

如果列表已经排序,我认为需要 (n/2)lg n。例如如果我们有一个类似 1,2,3,4,5,6,7,8,9,10 的列表,它已经排序,那么它将被划分为 (1,2,3,4,5) 和 ( 6,7,8,9,10) 部分。此外,该列表将分为 (1,2,3) 、 (4,5) 、 (6,7,8) 、 (9,10) 等。现在由于叶子已经排序,我们必须在合并期间仅将第一个列表的第一个元素与其他列表的所有元素进行比较。例如在 (1,2,3,4,5) 和 (6,7,8,9,10) 的情况下,我们将 1 与第二个列表中的所有元素进行比较,类似地 2 与所有元素进行比较,依此类推。因此,在级别 1 我们有 n/2 比较,在级别 2 我们有两个 n/4 比较(总共 n/2)等等。由于有 lg n(base 2) 个级别,我们将进行 (n/2)*lg n 个比较。

【问题讨论】:

  • 你怎么看?您能向我们展示您到目前为止所做的尝试吗?
  • 我认为 (n/2)lg n 表示已经排序的列表。
  • 对我来说似乎是正确的。

标签: sorting


【解决方案1】:

我认为答案应该是 (n/2)logn。在归并排序的每一级递归中,我们至少需要进行 (n/2) 次比较。由于合并排序有 logn 级别,因此答案将是总共 (n/2) 个 logn 比较。

更具体地说,我们可以举个例子: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) 8 次比较:将 9 与 1、2、3、4、5、6、7、8 进行比较 (1, 2, 3, 4, 5, 6, 7, 8) (9, 10, 11, 12, 13, 14, 15, 16) 8 次比较:将 5 与 1、2、3、4 进行比较,将 13 与 9、10、11、12 进行比较 (1, 2, 3, 4) (5, 6, 7, 8) (9, 10, 11, 12) (13, 14, 15, 16) 8 次比较:比较 3 与 1 和 2,比较 7 与 5 和 6,比较 11 与 9 和 10,比较 15 与 13 和 14 (1, 2) (3, 4) (5, 6) (7, 8) (9, 10) (11, 12) (13, 14) (15, 16) 8 次比较:比较 1 与 2、3 与 4、5 与 6、7 与 8、9 与 10、11 与 12、13 与 14、15 与 16。 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16)

此外,在最坏的情况下,总共会有 nlogn 比较。比如把原来的数组倒过来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2017-03-19
    • 2021-11-03
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多