【问题标题】:The complexity of bubble sort and insertion sort for a list with a given number of inversions具有给定反转次数的列表的冒泡排序和插入排序的复杂性
【发布时间】:2016-01-26 14:30:10
【问题描述】:

设一个列表的长度为n,反转的次数为d。为什么插入排序在 O(n+d) 时间内运行,为什么冒泡排序不运行?

当我考虑这个问题时,我在考虑最坏的情况。由于倒置的最坏情况是 n(n-1)\2,所以冒泡排序和插入排序同时运行。但是我不知道如何回答这个问题,因为我发现它们是一样的。有人可以帮我弄这个吗?

【问题讨论】:

    标签: algorithm sorting time-complexity bubble-sort insertion-sort


    【解决方案1】:

    对于冒泡排序,如果最后一个元素需要到达第一个位置(n 次反转),则您需要在整个数组上循环 n 次,每次将元素向前移动一个位置,以便获得 n^2 步,所以无论 d 的值如何,您都会得到 O(N^2)。

    插入排序中的相同设置将只执行 n+n 步来对所有内容进行排序 (O(N+d))。 d 实际上是对事物进行排序所需的交换插入排序的总数。

    当您假设 d 的最坏情况值为 n(n-1)/2 时,您错了。虽然这是真的,但如果你想用 d 来表达复杂性,你不能用它最坏的价值情况来代替它,除非你可以接受更高的界限。

    【讨论】:

    • 您能否解释一下,无论冒泡排序的 d 值如何,您是如何得到 O(N^2) 的?为什么 d 在过程中不相关?既然没有反转的时候不做swap,那它所花费的时间不会和d有关吗?
    • 在你通过列表​​运行一次后使用[2, 3, 4, 5, 6, 7, 8, 9, 1] 之类的东西,你交换 9 和 1。在另一个运行条目列表之后,你交换 8 和 1,所以你需要 N - 1 次遍历列表,每次检查每个连续的元素,以获得 1 到第一个位置。因此,您总共将进行 N* (N-1) 次比较。是的,我认为您总共会进行 d 次交换,但您仍然会进行 N^2 次比较,这给了您算法的复杂性。
    • 一般来说,您关心算法所执行的步数。每个步骤需要多长时间与复杂性无关(但它确实会改变运行时间)。如果您的算法进行 N^2 次检查,然后单步生成解决方案,则复杂度仍为 O(N^2)。如果算法做一次检查和 N^2 步生成解,复杂度仍然是 O(N^2)。
    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2015-04-25
    • 2012-05-12
    • 2018-05-09
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多