java中算法的时间复杂度

时间:2012-02-02 18:17:00

标签: java arrays sorting time complexity-theory

您好我使用以下通用冒泡排序算法,我想显示时间复杂度。我知道这个算法的最佳/最坏情况是固定的,但我想知道,它是否可以特定于我的数组?

例如,这种情况的最坏情况是O(n^2),这可能是我的数组特有的吗?

例如,最糟糕的情况是可以对120个元素中的100个进行排序(这就是我的数组特定的含义)。

public static <E extends Comparable<? super E>> void bubbleSort(E[] comparable) {
    boolean changed = false;
    do {
        changed = false;
        for (int a = 0; a < comparable.length - 1; a++) {
            if (comparable[a].compareTo(comparable[a + 1]) > 0) {
                E tmp = comparable[a];
                comparable[a] = comparable[a + 1];
                comparable[a + 1] = tmp;
                changed = true;
            }
        }
    } while (changed);
}

4 个答案:

答案 0 :(得分:6)

复杂性是函数(或算法)的渐近属性,而不是实际执行路径的渐近属性。复杂性表示输入大小和计算时间(或空间要求)之间的关系。因此,当应用于单个具体计算时,这个概念没有意义。

换句话说,您可以根据f(n)询问计算n的复杂程度,而不是计算f(5)。后者只是一个数字。前者是一个功能。

可以做的事情是计算实际的操作次数。每次执行要包含的操作(例如“比较”)时,只需递增一些全局计数器,然后检查其值。 (算法的复杂性应该告诉你这个计数器可能采用的值的界限。)

答案 1 :(得分:3)

算法的“最坏情况”性能是指一组输入数据,使算法表现得最差。因此,引用特定输入数组的“最坏情况”是没有意义的,因为那只是一个情况。

答案 2 :(得分:1)

在一般情况下,您的算法的最坏情况复杂度为O(n^2)(即不再而不是n^2,渐近)。它也是Theta(n^2)(即不多于而不是n^2)。我省略了乘法常数。

假设您对阵列有所了解。为了保持特定的内容,假设您知道您的数组需要不超过五个bubblesort类型的交换才能进行排序。有了这些知识,说算法的运行时间为O(n^2)仍然是正确的。但是,它不再是Theta(n^2)

正确地说,在该特定情况下算法的运行时间是O(n)。换句话说,了解数组的某些内容使我们能够在算法的运行时提供更严格的绑定

答案 3 :(得分:0)

当列表已经排序或接近排序O(n)时,会出现冒泡排序的最佳情况,所以是的,它可能取决于您的数组。