我正在比较bubblesort的实现,并在“while”循环中看到了一个带有“for”循环的替代方案。已知冒泡排序为o(n ^ 2)。如果在while循环中使用for循环,它仍然如此吗?我认为while和if语句的时间复杂度是相同的(即线性):
Array.prototype.bubblesort = function() {
var done = false;
while (! done) {
done = true;
for (var i = 1; i < this.length; i++) {
if (this[i - 1] > this[i]) {
done = false;
var tmp = this[i - 1];
this[i - 1] = this[i];
this[i] = tmp;
}
}
}
return this;
}
答案 0 :(得分:1)
循环的时间复杂度取决于执行的迭代次数以及各个循环体的复杂性。迭代次数取决于循环退出条件,它本身可能取决于循环体中的内容。
您执行从最内圈到最外圈的分析。
在目前的情况下,内循环(for
)总是执行length
次,并且正文执行有限数量的操作。因此,内循环的复杂性为O(length)
。
外部循环(while
)的讨论稍微复杂一些,因为它依赖于内部循环设置的done
标志。因此外部循环的迭代次数是可变的,并且取决于数组的内容。如果没有更深入的研究,我们可以说外循环至少会有一次迭代,最多只有length
次迭代。
后面的陈述可以证明如下:内部循环是这样的,它将最大的元素移动到最右边的位置,然后是第二个最大的元素移动到最右边的位置,依此类推。无论初始配置如何,在length
通过后,不会再出现掉期。
总之,我们可以确认算法在最坏的情况下需要时间O(length²)
,在最好的情况下需要O(length)
,即最初对数组进行排序。