我试图理解数据结构和不同的算法,然后我对测量冒泡排序时间复杂度感到困惑。
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。
有人可以告诉我如何计算正确的值。
答案 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)