알고리즘 문제를 풀다가 나와 거의 동일한 방법으로 문제를 해결한 코드를 봤다.
나는 매개변수로 나온 Arrays 에서 바로 정렬을 했지만,
그 분은 ArrayList 로 변경 후 Collection 으로 정렬을 했었다.
효율이 어떻게 나올지 궁금해 복사해서 재출해보니 내 코드보다 효율이 더 좋았다.
내가 생각했을 때 배열을 리스트로 변환하는 시간이 더해저 더 오래걸릴 것이라고 생각했는데 아니였다.
혹시 모를 변수가 있을 수 있어서 실험을 해보기로 했다.
길이가 99999 인 배열을 생성후 랜덤으로 숫자를 입력해주었다.
int[] a = new int[99999];
for (int i = 0; i < a.length; i++) {
double v = Math.random() * 99999;
a[i] = (int) v;
}
검증 방법은 System.nanoTime() 라이브러리를 사용했다.
long start = System.nanoTime();
Arrays.sort(a);
long end = System.nanoTime();
System.out.println((end-start) / 1000000.0);
난수를 입력했기 때문에 속도 편차가 조금 있는 것 같았다.
결과는 40~47 정도가 나왔다.
long start = System.nanoTime();
Arrays.sort(a);
long end = System.nanoTime();
System.out.println((end-start) / 1000000.0); // 40 ~ 47
Array List 를 선언하는 것 부터 시간을 측정했다.
결과는 47 ~ 51 정도가 나왔다.
long start = System.nanoTime();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < a.length; i++)
list.add(a[i]);
Collections.sort(list);
long end = System.nanoTime();
System.out.println((end-start) / 1000000.0); // 47 ~ 51
배열일 경우 배열 그 자체를 정렬하는 것이 효율이 근소하게 더 좋다.
하지만 List 를 사용하면 다양한 라이브러리를 사용할 수 있기때문에 그걸 포기할 만큼 효율이 떨어지진 않았다.
크게 차이 없으니 그때 그때 더 알맞는 방법을 사용하면 되겠다.