一个问题突然出现在我的脑海里,因为时间的复杂性 get(index)
linkedlist的方法不是o(1),而是o(n),那么,它会影响排序的时间复杂度吗?例如,下面的代码(气泡排序):
public static void bubbleSort(int arr[])
{
int n = arr.length;
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
当我执行冒泡排序时,我需要得到元素。在任何排序算法中,都需要得到元素,所以。。。在执行冒泡排序时,平均时间复杂度是否为o(n*log(n)n)?如果是,当我使用 Collections.sort(linkedList)
,平均时间复杂度是否也是o(nlog(n)*n)?
3条答案
按热度按时间biswetbf1#
在执行冒泡排序时,平均时间复杂度是否为o(n*log(n)*n)?
你在错误的观念下运作。气泡排序是
O(n^2)
. 这不是一个有效的排序算法。linkedlist基本上是无用的;它的性能优于arraylist的情况实际上是不存在的(你可能会认为o(1)在任何地方插入都是有用的,但是除非你有一个listiterator,它的缺点是性能方面的,由于它与片上缓存的交互方式(即:非常非常糟糕),比算法复杂性所显示的要糟糕得多。
正如屋大维的答案已经强调的那样,对所有列表进行排序的默认方法(linkedlist并不费心去改变这种行为,但它可以)就是用o(1)get access将一个完整的副本复制到某个地方,在那里排序,然后将它全部复制回来。从算法上来说,这意味着
O(n)
因素,这是无关的(排序,因为它至少O(n log n)
毕竟。记住,算法复杂性只是告诉你,一旦你给它足够大的输入相对于其他大的输入,它的性能的行为。1
O(n^2)
算法可以比其他算法快上千倍。像这样排序linkedlist是。。。不太好。比arraylist慢得多,即使在
O(n)
.bkhjykvo2#
对于“何时执行冒泡排序”,这取决于如何实现冒泡排序。对于链表,冒泡排序尤其需要o(n^2)——不比通常差——因为它总是将元素紧挨着地寻址。不过,正如您所描述的,一个简单的实现需要o(n^3)。
来自javadoc的
Collections.sort
:这个实现将指定的列表转储到一个数组中,对数组排序,并在列表上迭代,从数组中的相应位置重置每个元素。这避免了由于尝试对链表进行适当排序而导致的n2 log(n)性能。
cgh8pdjw3#
这是执行
List.sort
( java 语13)正如您所看到的,无论您想要排序什么列表实现,性能都几乎相同。
现在,如果我们看看
toArray
我们看到以下内容:双链表
数组表
所以,如果你想对linkedlist排序,它会比arraylist慢一点,但不会太多。