这个排序算法的大O.

时间:2013-01-23 16:32:29

标签: c arrays complexity-theory

  

可能重复:
  What’s the complexity of for i: for o = i+1

我为长度为5的数组做了以下排序算法:

int myarray[5] = {2,4,3,5,1};
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("%d", myarray[i]);

        int j;
        for (j=i+1; j < 5; j++) 
        {
            int tmp = myarray[i];
            if (myarray[i] > myarray[j]) {
                tmp = myarray[i];
                myarray[i] = myarray[j];
                myarray[j] = tmp;
            }
        }
    }

我相信这种排序算法的复杂性是O(n*n),因为对于每个元素,你将它与其余元素进行比较。但是,我也注意到,每次我们在外循环中增加时,我们都不会与其他所有数据进行比较,但其余部分 - 我。会有什么复杂性?

8 个答案:

答案 0 :(得分:7)

它仍然是O(n²)(或O(n * n),正如您所写的那样)。在分析计算复杂性时,只有最高阶项是重要的。

答案 1 :(得分:5)

你是对的:
它是O(1 + 2 + 3 ... + N)
但数学上只是:
= O(n *((n-1)/ 2))
但那只是:
= O(n ^ 2)

答案 2 :(得分:3)

你是对的,它是O( n 2 )。

以下是如何计算它。在第一次迭代中,您将看到 n 元素;在下一个, n - 1,依此类推。如果您写入该总和的两个副本,并除以2,则可以将这些术语配对,以便将第一个副本 n 中的第一个术语添加到第二个副本1的最后一个术语中,等等。你结束 n + 1的 n 副本,所以总和最后是 n *( n + 1)/ 2. Big-O仅区分渐近行为;渐近行为由最高阶项描述,而不考虑常数因子,即 n 2

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

答案 3 :(得分:2)

这是冒泡排序,确实是复杂度O(n ^ 2)

可以在以下求和中推测算法的整个运行时间:

  

n +(n-1)+(n-2)+ ... + 1 = n(n + 1)/ 2

由于只有最高阶项对渐近分析感兴趣,因此复杂度为O(n ^ 2)

答案 4 :(得分:2)

大O符号是渐近。这意味着我们忽略了- i等常数因素。您的算法的复杂性为O(N²)(另请参阅here)。

答案 5 :(得分:1)

复杂性为O(1)O符号仅适用于大型输入,其中增加或减少不仅可见,而且相关。

如果您要扩展它,那将是O(n^2),是的。

答案 6 :(得分:1)

用于多个循环

n * m * .. no.of循环

对于上述代码,在最坏的情况下,其n * n = n ^ 2

BigOh表示最大界限。

所以最大的复杂性不能大于此。

答案 7 :(得分:0)

有关 i = 0它运行n次

i = 1它运行n-1次

i = 2它运行n-2次     ....

  So total Sum = (n) + (n-1) + (n-2) + .... + 1
           sum =  (n*n) - (1 + 2 + ...)
               =  n^2   - 

如此大的O复杂度= O(n ^ 2){上限; +或 - 被忽略}