【问题标题】:Worst case time complexity for this stupid sort?这种愚蠢排序的最坏情况时间复杂度?
【发布时间】:2015-06-16 18:33:49
【问题描述】:

代码如下:

for (int i = 1; i < N; i++) {
    if (a[i] < a[i-1]) {
        swap(i, i-1);
        i = 0;
    }
}

在尝试了一些事情之后,我认为最坏的情况是输入数组按降序排列。然后看起来比较将是最大的,因此我们将只考虑比较。那么它似乎是总和的总和,即 ... {1+2+3+...+(n-1)}+{1+2+3+...+(n-2 )}+{1+2+3+...+(n-3)}+ .... + 1 如果是的话 O(n) 是什么?

如果我不在正确的道路上,有人可以指出 O(n) 是什么以及如何推导出它?干杯!

【问题讨论】:

  • 该算法一次删除一个反转。在最坏的情况下,它会进行 O(n^2) 次交换,并且可能会进行 O(n^3) 次其他操作,因为至少一半的交换将发生在数组的后半部分。

标签: algorithm sorting time-complexity


【解决方案1】:

对于初学者来说,总和

(1 + 2 + 3 + ... + n) + (1 + 2 + 3 + ... + n - 1) + ... + 1

实际上不是 O(n)。相反,它是 O(n3)。您可以看到这一点,因为总和 1 + 2 + ... + n = O(n2,并且每个都有 n 个副本。您可以更准确地证明这个总和是 Θ( n3) 通过查看这些术语的前 n / 2。这些术语中的每一个至少是 1 + 2 + 3 + ... + n / 2 = Θ(n2 ),所以有 n / 2 个 Θ(n2) 的副本,给出 Θ(n3) 的紧密界限。

我们可以在 O(n3) 时设置该算法的总运行时间上限,方法是注意每次交换都会将数组中的反转次数减少一(inversion em> 是一对不合适的元素)。一个数组中最多可以有 O(n2) 个反转,而一个排序数组中没有反转(你明白为什么吗?),所以最多有 O(n2 ) 传递数组,每个最多需要 O(n) 的工作。这共同给出了 O(n3) 的界限。

因此,您确定的 Θ(n3) 最坏情况运行时是渐近紧密的,因此算法运行时间为 O(n3) 并且具有最坏情况运行时 Θ(n3).

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    每次交换都会对列表进行一次迭代。对于反向列表,所需的最大交换次数为O(n * n)。每次迭代都是O(n)

    因此算法为O(n * n * n)

    【讨论】:

      【解决方案3】:

      这是臭名昭著的冒泡排序的一半,它有一个 O(N^2)。这种部分排序有 O(N),因为 For 循环从 1 到 N。经过一次迭代后,您将在列表末尾得到最大的元素,而列表的其余部分以某种改变的顺序结束。要成为一个正确的冒泡排序,它需要在这个循环中再有一个循环来将 j 从 1 迭代到 N-i 并做同样的事情。 If 进入内部循环。

      现在你有两个循环,一个在另一个循环中,它们都从 1 变为 N(有点)。您将进行 N * N 或 N^2 次迭代。因此,冒泡排序为 O(N^2)。

      现在你已经作为程序员迈出了下一步:完成冒泡排序并使其正常工作。尝试使用不同长度的列表 a 并查看需要多长时间。然后永远不要再使用它。 ;-)

      【讨论】:

      • 您似乎忽略了i = 0;,它重置了循环并使算法 O(n3) 而不是 O(n2)。
      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多