您好我使用以下通用冒泡排序算法,我想显示时间复杂度。我知道这个算法的最佳/最坏情况是固定的,但我想知道,它是否可以特定于我的数组?
例如,这种情况的最坏情况是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);
}
答案 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)
时,会出现冒泡排序的最佳情况,所以是的,它可能取决于您的数组。