【发布时间】:2021-03-16 23:06:12
【问题描述】:
突然想到一个问题,由于linkedList的get(index)方法的时间复杂度不是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(n*log(n)*n)吗?
【问题讨论】:
-
我记得,Java List 实现有一个支持数组。因此,get 操作始终保证为 O(1)。此外,您可以使用 HashMaps 实现类似的东西来存储列表中的节点索引。
-
Collections.sort使用 QuickSort 或 TimSort 的改编版本,具体取决于列表大小。对于这些算法,复杂度为 O(log(n)) 或 O(n log(n)) -
@Harsh ArrayList 有这个属性,LinkedList 没有。不,Java 列表操作上的 get() 操作根本不能保证为 O(1)。
-
@rzwitserloot 感谢您的信息。我不知道这一点。
标签: java sorting linked-list