算法的运行时间(大O))

时间:2013-06-29 13:06:12

标签: algorithm time-complexity asymptotic-complexity

我计算这个算法的运行时间?

                              Cost      No Of Times

for(j=1;j<=n-1;j++){          c1       n(loop will run for n-1 times +1 for failed cond              

    for(i=0;i<=n-2;i++){      c2       n*(n-1) (n-1 from outer loop and n for inner 

        if(a[i]>a[i+1]){      c3       (n-1)*(n-1)

            Swap              c4       (n-1)*(n-1) {in worst case }
        }
    }
最糟糕的情况

T(n)= c1 * n + c2 *(n-1) n + c3 (n-1)(n-1)+ c4 *(n-1)(n-1)  ,即O(n ^ 2)

最佳情况:

T(n)= c1 * n + c2 *(n-1) n + c3 (n-1)(n-1) 即O(n ^ 2)。

但实际上在最好的情况下,冒泡排序的时间复杂度为O(n)。 谁能解释一下?

3 个答案:

答案 0 :(得分:3)

冒泡排序在最佳情况下具有O(n)时间复杂度,因为可以将已排序的列表传递给它。

您必须检查在第二个嵌套循环后是否进行了任何交换。如果没有进行交换,则列表已排序,无需继续,因此您可以打破循环。

对于已排序的列表,在这种情况下,您将迭代所有n个元素。

答案 1 :(得分:2)

你实现冒泡排序的算法是正确的但效率不高,

// n是元素的总数

do{  

  swp = false // swp checks whether or not any variable has been swapped  
                      in the inner loop  

         for(i=0;i<=n-2;i++){  

                  if(a[i]>a[i+1])

                  {
                        swap(a[i],a[i+1])

                        sw = true
                   }
        n = n-1             
    }while(sw == true && n>0)

swp是一个变量,它检查内循环中是否有任何交换,
如果没有任何交换,这意味着我们的数组已经排序。

冒泡排序的最佳情况是元素已按升序排序(在本例中) 内循环只运行一次,但if条件(在内循环中)永远不会满足, swp 保持为false,因此我们在一次迭代后退出外循环这给泡沫排序O(n)复杂性。

答案 2 :(得分:0)

你可以使用Sigma Notation来计算迭代次数(循环中的内容是不相关的,因为它是恒定时间):

enter image description here

具有最佳案例运行时间的冒泡排序实际上是此排序算法的增强版本。

在第一次解析(外循环)期间,如果没有执行交换,那就是数组排序的决定性信息,无意义覆盖所有情况。

因此,外循环将迭代一次,内循环将迭代 n 次:整个n + 1次迭代==&gt;的 O(n)的