【问题标题】:How is insertion better than mergesort in partially sorted array?在部分排序的数组中插入比合并排序更好吗?
【发布时间】:2012-10-02 13:48:46
【问题描述】:

我必须开发一种能够对 n 元素列表进行排序的算法,其中第一个 (n- root(n)) 元素被排序。是的,这是一个家庭作业问题。

在互联网上的一些researchstack-overflow 之后,我相信插入排序和冒泡排序最适合部分排序的数组。这个link 清楚地表明插入排序比合并排序好。我已经把插入排序作为我作业的答案。

但是,当我开始进行渐近复杂性分析时,我会感到困惑。

对于插入排序,我们至少要看看每个元素。如果元素未排序,我们将不得不进行移位/反转。因此,插入排序将有 O(n + m),其中 m 是总反转。或者,我们也可以说它的线性复杂度为 O(n)。

对于归并排序,我们需要对未排序的 root(n) 元素进行归并排序,这将给出 root(n)log(root (n)) 复杂度。此外,我们需要与排序列表进行合并(这将花费 O(n))。因此,复杂度将是 O(root(n) log (root (n)) + n) 或 O(n),因为 n 支配 root(n) log (root(n))。

为什么两者具有相同的渐近复杂度?这只是我的好奇心。我可能在复杂性计算中间的某个地方犯了错误。

我是一名学生,仍在学习。我很感激任何帮助。谢谢。

【问题讨论】:

    标签: algorithm sorting complexity-theory


    【解决方案1】:

    此列表中的总反转计数可能高达 (n - Sqrt(n)) * Sqrt(n) = O(n3/2)。

    示例:100 元素列表 (10 11 12..99 100 1 2 3 4 5 6 7 8 9 10) 的反转计数为 900,因此插入排序将执行大约 900 次操作(每个尾元素 90 次移位)

    【讨论】:

    • 你能详细说明你的答案吗?我仍然很困惑。谢谢!
    • 我举了一个例子,反转计数(和插入排序的操作计数)是900(大约100^(3/2))
    猜你喜欢
    • 2016-06-03
    • 2012-05-12
    • 2016-02-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多