有这个用于bubblesort的java代码:
public void sort() {
for(int i = 1; i < getElementCount() ; ++i) {
for(int j = getElementCount()-1; j >= i; j--) {
if (cmp(j,j-1) < 0) swap(j, j-1);
}
}
}
方法“cmp”和“swap”如下:
public int cmp(int i, int j) {
return get(i).intValue()-get(j).intValue();
}
public void swap(int i, int j) {
Integer tmp = get(i);
set(i, get(j));
set(j, tmp);
}
我现在已经编写了Bubblesort的改进版本,其中排序方法“sort()”如下所示:
public void sort() {
boolean done = false;
for(int i = 1; i < getElementCount() && !done; ++i) {
done = true;
for(int j = getElementCount()-1; j >= i; j--) {
if (cmp(j,j-1) < 0) {
swap(j, j-1);
done = false;
}
}
}
}
有人能解释如何计算后一种算法的时间复杂度吗?我认为它一次比较n个元素,因此在最好的情况下它有复杂度O(1),而在最坏的情况下它有O(n ^ 2),但我不知道我是否正确我想知道如何思考这个问题。
答案 0 :(得分:0)
复杂性告诉程序员处理数据需要多长时间。
O(1)的复杂性表明,无论有多少元素,它只需要一次操作。
在数组中插入一个值会有O(1)
E.g。
array[100] = value;
在最好的情况下,您必须遍历整个数组并比较每个元素。 然后,您的复杂性代码为O(n),其中n是数组中元素的数量。 在最坏的情况下,您将不得不为每个元素运行一次数组,这将给出O(n * n)的复杂性
答案 1 :(得分:0)
我只是看了你做了什么,它与你之前列出的完全相同。你已经设置了一个布尔条件done = false,然后你正在检查它的否定,它总是评估为true - 与之前完全相同的逻辑。您可以在代码中删除已完成,您将看到它运行完全相同。与以前一样,您将具有O(n)的最佳情况复杂度和O(n ^ 2)的最差情况复杂度。任何排序算法都不可能是O(1),因为至少你必须在列表中移动一次给出O(n)。
答案 2 :(得分:0)
最坏情况:如果数组按排序的反向顺序(降序)排序,它将显示O(N ^ 2)的最差时间复杂度。
最佳情况:如果数组按排序顺序排列,则内循环将至少遍历每个元素一次,因此它是O(N) - &gt; (如果您使用完成中的信息(代码中不存在)中断了循环。
在任何时候都不能是O(1)(事实上,在数学上不可能获得比O(N)更低的函数,因为排序的下限是Omega(N),用于基于比较的排序)
Omega(N)是最低功能,比较你必须至少看一次所有元素。
答案 3 :(得分:0)
最好的方法是使用Sigma表示法表示你的循环,如下所示(一般情况):
'c'在这里指的是在最里面的循环内执行的if
,cmp
和swap
的常量时间。
对于最佳情况(修改后的冒泡排序),运行时间应如下所示: