如何计算冒泡排序时间复杂度

时间:2015-04-10 07:37:29

标签: algorithm sorting

我试图理解数据结构和不同的算法,然后我对测量冒泡排序时间复杂度感到困惑。

for (c = 0; c < ( n - 1 ); c++) {
  for (d = 0; d < n - c - 1; d++) {
    if (array[d] > array[d+1]) /* For descending order use < */
    {
      swap       = array[d];
      array[d]   = array[d+1];
      array[d+1] = swap;
    }
  }
}

现在每个Big O都会告诉Best case O(n),Avg case(n2)和Worst Case(n2)。但是当我看到代码时,发现在第一阶段内循环运行n次然后在第二阶段n - 1 ,和n - 2等。这意味着在每次迭代中它的值都会下降。 例如,如果我有[] = {4,2,9,5,3,6,11},那么比较的总数将是 -

1st Phase - 7 time
2nd phase - 6 time
3rd Phase - 5 time
4th Phase - 4 time
5th Phase - 3 time
6th Phase - 2 time
7th Phase - 1 time

所以当我计算它看起来的时间=(7 + 6 + 5 + 4 + 3 + 2 + 1)+ 7 = 35,但是最差的时间复杂度是n2,按照doc。

有人可以告诉我如何计算正确的值。

7 个答案:

答案 0 :(得分:19)

让我们来看看Big O for Bubble Sort的案例

案例1)O(n)(最佳案例) 如果数组已经排序,则会出现这种时间复杂性,这意味着没有发生交换,只有1次迭代的n个元素

案例2)O(n ^ 2)(最坏情况) 最糟糕的情况是,如果数组已经排序但是按降序排列。这意味着在第一次迭代中它必须查看n个元素,然后它将看起来n-1个元素(因为最大的整数在最后),依此类推,直到1个比较发生。 Big-O = n + n - 1 + n - 2 ... + 1 =(n *(n + 1))/ 2 = O(n ^ 2)

在您的示例中,它可能无法检查每个阶段中的这些元素,因为数组不是按降序排列。

答案 1 :(得分:7)

所以你已经注意到完成的比较总数是n +(n - 1)+ ... + 2 + 1。 这个总和等于n *(n + 1)/ 2(见Triangular Numbers),它等于0.5 n ^ 2 + 0.5 n,显然是O(n ^ 2)。

答案 2 :(得分:4)

它在两个元素之间进行比较。所以 第一阶段 - n-1比较。即6 第二阶段 - n-2比较。即5 等到1。 因此,sum = n(n-1)/ 2,即O(n ^ 2)。

如果有任何错误,你可以纠正.....

答案 3 :(得分:2)

O(n^2) = n(n-1)/2是正确的。

如上面的5个元素的例子。

5(5-1)/2 == 10.

5(5+1)/2 != 10. 

答案 4 :(得分:1)

在这里解释最坏的情况:

elements = raw_input("enter comma separated elements : ")
elements = elements.split(',')
elements = map(int, elements)
length = len(elements)

for i in xrange(length - 1):
    print "outer pass : ", i
   for j in xrange(length - i - 1):
       print "inner pass : ", j
       if elements[j] > elements[j + 1]:
           elements[j + 1], elements[j] = elements[j], elements[j + 1]
       print "elements : ", elements
print elements

输出:

输入逗号分隔的元素:5,4,3,2,1

外传:0

内传:0

元素:[4,5,3,2,1]

内传:1

元素:[4,3,5,2,1]

内传:2

元素:[4,3,2,5,1]

内传:3

元素:[4,3,2,1,5]

外传:1

内传:0

元素:[3,4,2,1,5]

内传:1

元素:[3,2,4,1,5]

内传:2

元素:[3,2,1,4,5]

外传:2

内传:0

元素:[2,3,1,4,5]

内传:1

元素:[2,1,3,4,5]

外传:3

内传:0

元素:[1,2,3,4,5]

[1,2,3,4,5]

因此,第一次迭代扫描所有n个元素,它将在下一次迭代中扫描n-1个元素。等等所有元素。

n + n - 1 + n - 2 ... + 1 =(n *(n + 1))/ 2 = O(n ^ 2)

答案 5 :(得分:1)

最佳情况 :如果已对数组进行排序,则可能会出现这种时间复杂性。这意味着不会发生交换,并且只有n个元素的1次迭代。

所以时间复杂度是 O(n)

最坏情况:如果数组已经排序但降序排列,则可能会出现这种时间复杂性。

第一次迭代中,比较次数= n-1
第二次迭代中,比较次数= n-2
.............................................. ........................
.............................................. ........................
.............................................. ........................
第(n-2)次迭代中,比较次数= 2
第(n-1)次迭代中,比较次数= 1

对于n个元素,迭代总数= n-1
比较总数 S =(n-1)+(n-2)+ ........ + 2 + 1 1
我们也可以这样写: S = 1 + 2 + ........ +(n-2)+(n-1)
................................................... ................................................... ..................................... 2S = n + n + ......... + n + n ...。[同时添加两行]
2S = n(n-1) ..... [总迭代次数= n-1]
S = n(n-1)/ 2
在多项式函数中,n的最高阶被视为时间复杂度。
因此,时间复杂度为 O(n ^ 2)

答案 6 :(得分:0)

对于n个数字,完成的比较总数将是(n-1)+ ... + 2 + 1.该和等于(n-1)* n / 2(参见三角数)等于0.5 n ^ 2 - 0.5 n即O(n ^ 2)