Будет ли Arrays.sort() увеличивать сложность времени и сложность пространства?

Существует проблема, связанная с массивом, требование заключается в том, что временная сложность 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() стоить больше места?

Ответ 1

Я предполагаю, что вы говорите о Java здесь.

Итак, цикл будет стоить время O (n), мой вопрос в том, будет ли Arrays.sort() стоить больше времени?

Да, Arrays.sort(int[]) во всех реализациях стандартной библиотеки Java, которые я знаю, является примером сравнения и должен иметь худшую сложность Ω (n log n). В частности, Oracle Java 7 использует вариант с двоякоприводным quicksort для целых перегрузок, который на самом деле имеет наихудший случай Ω (n 2).

и будет ли Arrays.sort() стоить больше места?

По всей вероятности, он будет использовать пространство ω (1) (что означает другое да, использование пространства не O (1)). В то время как невозможно реализовать сортировку на основе сравнения только с постоянным дополнительным пространством, это очень непрактично.

Тем не менее, при определенных условиях можно сортировать определенные типы данных в линейном времени, см., например:

С постоянным диапазоном входных целых чисел (например, если abs(A[i]) <= C для некоторой константы C), то подсчет сортировки сортировки и радикса действительно использует только время O (n) и O (1), поэтому это может быть полезно.

Ответ 2

Это больше, чем время O (n) и требует больше, чем O (1) пространства.

Arrays.sort() использует измененный Timsort в 1.7, который является сравнительно недавно разработанным алгоритмом сортировки и предлагает сортировку со сложностью x, где O (n) x < O (nlgn) и пространство O (n/2)

Ответ 3

Arrays.sort(int [] a) в недавнем JDK реализована с помощью алгоритма Doublespot Quicksort, который имеет среднюю сложность O (n log n) и выполняется на месте (например, не требует дополнительного места).