我为长度为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)
,因为对于每个元素,你将它与其余元素进行比较。但是,我也注意到,每次我们在外循环中增加时,我们都不会与其他所有数据进行比较,但其余部分 - 我。会有什么复杂性?
答案 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){上限; +或 - 被忽略}