时间复杂度修改了bubblesort

时间:2014-03-09 16:38:59

标签: java algorithm sorting complexity-theory

有这个用于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),但我不知道我是否正确我想知道如何思考这个问题。

4 个答案:

答案 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表示法表示你的循环,如下所示(一般情况):

enter image description here

'c'在这里指的是在最里面的循环内执行的ifcmpswap的常量时间。

对于最佳情况(修改后的冒泡排序),运行时间应如下所示:

enter image description here