我在很多地方看到过,冒泡排序的复杂性是O(n 2 )。
但是怎么会这样呢,因为内环应该总是运行n-i次。
for (int i = 0; i < toSort.length -1; i++) {
for (int j = 0; j < toSort.length - 1 - i; j++) {
if(toSort[j] > toSort[j+1]){
int swap = toSort[j+1];
toSort[j + 1] = toSort[j];
toSort[j] = swap;
}
}
}
答案 0 :(得分:7)
And what is the "average" value of n-i
? n/2
So it runs in O(n*n/2)
which is considered as O(n2)
答案 1 :(得分:3)
有不同类型的时间复杂度 - 您使用的是大O符号,这意味着此函数的所有情况至少都是这种时间复杂度。
当它接近无穷大时,这基本上是n ^ 2时间复杂度的最坏情况。时间复杂性并不是一门确切的艺术,但更多的是为这类算法所期望的速度提供了一个大概的范围,因此你会试图过于精确。
例如理论时间复杂度很可能是n ^ 2,即使它理论上应该是n * n-1,因为可能会执行任何无法预料的处理开销。
答案 2 :(得分:1)
Since outer loop runs n times and for each iteration inner loop runs (n-i) times , the total number of operations can be calculated as n*(n-i) = O(n2).
答案 3 :(得分:0)
它是O(n ^ 2),因为长度*长度。