这种愚蠢的排序最糟糕的时间复杂性?

时间:2015-04-10 22:26:46

标签: algorithm sorting time-complexity

代码如下:

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)会是什么以及它是如何得出的?干杯!

3 个答案:

答案 0 :(得分:7)

首先,总和

  

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

实际上不是O(n)。相反,它是O(n 3 )。你可以看到这个,因为总和1 + 2 + ... + n = O(n 2 ,并且每个都有n个副本。你可以更正确地表明这个总和是Θ( n 3 )通过查看这些术语的前n / 2个。这些术语中的每一个至少为1 + 2 + 3 + ... + n / 2 =Θ(n 2 ),所以有n / 2个副本的Θ(n 2 ),给出了Θ的紧束缚(n 3 )。

我们可以在O(n 3 )上限该算法的总运行时间,注意每个交换减少一个数组中的反转次数(反转是一对不合适的元素)。数组中最多可以有O(n 2 )反转,并且排序数组中没有反转(你明白为什么?),所以最多有O(n 2 )遍历数组,每个最多需要O(n)工作。这共同给出了O(n 3 )的界限。

因此,您已识别的Θ(n 3 )最坏情况运行时渐近紧,因此算法在时间O(n 3 )运行并具有最坏情况的运行时间Θ(n 3 )。

希望这有帮助!

答案 1 :(得分:6)

每次交换执行一次列表迭代。对于反转列表,必要的最大交换次数为O(n * n)。每次迭代都是O(n)

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

答案 2 :(得分:-2)

这是臭名昭着的泡泡排序的一半,其中有一个O(N ^ 2)。这个局部排序有O(N),因为For循环从1变为N.在一次迭代之后,你将得到列表末尾的最大元素,并且列表的其余部分以某些变化的顺序结束。要成为一个合适的冒泡排序,它需要在这一个内部的另一个循环迭代j从1到N-i并做同样的事情。 If进入内循环。

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

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

相关问题