一个linkedlist需要更长的时间来排序吗?

zf2sa74q  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(486)

一个问题突然出现在我的脑海里,因为时间的复杂性 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)?

biswetbf

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) .

bkhjykvo

bkhjykvo2#

对于“何时执行冒泡排序”,这取决于如何实现冒泡排序。对于链表,冒泡排序尤其需要o(n^2)——不比通常差——因为它总是将元素紧挨着地寻址。不过,正如您所描述的,一个简单的实现需要o(n^3)。
来自javadoc的 Collections.sort :
这个实现将指定的列表转储到一个数组中,对数组排序,并在列表上迭代,从数组中的相应位置重置每个元素。这避免了由于尝试对链表进行适当排序而导致的n2 log(n)性能。

cgh8pdjw

cgh8pdjw3#

这是执行 List.sort ( java 语13)

default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

正如您所看到的,无论您想要排序什么列表实现,性能都几乎相同。
现在,如果我们看看 toArray 我们看到以下内容:
双链表

public Object[] toArray() {
    Object[] result = new Object[size];
    int i = 0;
    for (Node<E> x = first; x != null; x = x.next)
        result[i++] = x.item;
    return result;
}

数组表

public Object[] toArray() {
    return Arrays.copyOf(elementData, size);
}

所以,如果你想对linkedlist排序,它会比arraylist慢一点,但不会太多。

相关问题