Arrays.sort()会增加时间复杂度和时空复杂度吗?

时间:2014-03-21 23:57:21

标签: java arrays sorting time-complexity space-complexity

存在与数组相关的问题,要求时间复杂度为O(n),空间复杂度为O(1)。

如果我使用Arrays.sort(arr),并使用for循环进行一次传递循环,例如:

public static int hello(int[]A){
  Arrays.sort(A);
  for(int i=0;i<A.length;i++){
     ....................
  }
  return ....;

}

因此循环将花费O(n)时间。我的问题是:Arrays.sort()会花费更多时间吗?如果我使用Arrays.sort(),这次复杂性仍然是O(n)吗? Arrays.sort()会花费更多空间吗?

5 个答案:

答案 0 :(得分:20)

我假设你在这里谈论Java。

  

因此循环将花费O(n)时间,我的问题是Arrays.sort()会花费更多时间吗?

在我知道的所有Java标准库实现中,

Arrays.sort(int[])是基于比较的排序的示例,因此must have worst-case complexity Ω(n log n)。特别是,Oracle Java 7对整数重载使用双枢轴快速排序变量,实际上有一个Ω(n 2 最坏情况。

  

并且Arrays.sort()会占用更多空间吗?

很可能它会使用ω(1)空间(这意味着另一个,空间使用不是O(1))。虽然实现基于比较的排序并非不可能只有恒定的额外空间,但这是非常不切实际的。

也就是说,在某些情况下,可以按线性时间对特定类型的数据进行排序,例如:

具有恒定范围的输入整数(例如,对于某些常量C,如果abs(A[i]) <= C),那么计算排序和基数排序确实只使用O(n)时间和O(1)空间,因此可能是是有用的。

答案 1 :(得分:2)

超过O(n)时间并且需要超过O(1)空间。

Arrays.sort()利用1.7中的修改后的Timsort,这是一种相对最近开发的排序算法,它提供了复杂度x的排序,其中O(n)<0。 x&lt; O(nlgn)和O(n / 2)的空间

答案 2 :(得分:1)

最近JDK中的Arrays.sort(int [] a)是使用双枢轴Quicksort算法实现的,该算法具有O(n log n)平均复杂度并且就地执行(例如,不需要额外的空间)。

答案 3 :(得分:1)

根据Arrays.sort()方法的java jvm 8 javadocs:

排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch的Dual-Pivot Quicksort。该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。

因此,它会将您的时间复杂度从O(n)增加到O(n log(n))

答案 4 :(得分:0)

既然你是用Java语言谈论它,时间复杂度肯定会从O(n)增加到O(nlogn)。那是因为在 Java 8 中, Arrays.sort() 是在 Dual-pivot quicksort 算法中实现的,而不是 single pivot 。所以需要额外的时间。 而 O(1) 的空间复杂度是不可能的,因为它需要更多的空间,我猜是 O(n/2)。