문제
https://www.acmicpc.net/problem/2751
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public static void main(String[] args) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
int amount = Integer.parseInt(br.readLine());
List<Integer> list = new ArrayList<>(); for (int i = 0; i < amount; i++) { list.add(Integer.parseInt(br.readLine())); }
Collections.sort(list);
StringBuilder sb = new StringBuilder(); for (int i : list) { sb.append(i).append("\n"); }
System.out.println(sb); } }
|
Arrays.sort(int[]) vs Arrays.sort(Object[]) and Collections.sort(List)
Arrays.sort(int[])
- DualPivotQuicksort라는 피벗을 두 개를 정해 구간을 3개로 하는 퀵소트를 사용한다.
- API에 따르면 이 때 평균 O(n log(n)) 성능을 제공하며 일반적으로 기존 (one-pivot) 쿽소트 보다 빠르다고 한다.
- 하지만 여전히 최악의 경우 O(n^2)인 것은 여전하다.
Arrays.sort(Object[]) and Collections.sort(List)
- java.util.Arrays.useLegacyMergeSort 설정에 따라 true면 legacyMergeSort를 통해 Merge sort로 정렬하고 false면 TimeSort를 통해 Tim sort로 정렬한다.
- 이 때 기본적으로 java.util.Arrays.useLegacyMergeSort 설정은 false로 지정되어 있다.
- Tim sort는 Insertion sort와 Merge sort를 결합하여 만든 정렬로 최선의 경우 O(n), 평균적으로 O(n log(n)), 최악의 경우 O(n log(n))의 성능을 제공한다.
- Tim sort에 대한 자세한 설명
java.util.Arrays.useLegacyMergeSort 확인
1 2 3 4 5 6 7 8 9 10
| ...
static final class LegacyMergeSort { private static final boolean userRequested = java.security.AccessController.doPrivileged( new sun.security.action.GetBooleanAction( "java.util.Arrays.useLegacyMergeSort")).booleanValue(); }
...
|
- new sun.security.action.GetBooleanAction(“java.util.Arrays.useLegacyMergeSort”)).booleanValue(); 를 sysout으로 출력해보면 false가 return 되는 것을 확인할 수 있다.
결과