본문 바로가기

TIPS

Java 정렬(sort) 기초 가이드

728x90
반응형
SMALL

 

 

 

Java에서 정렬(Sorting)은 데이터를 원하는 순서로 정리하는 중요한 과정이다.

이번 포스팅에서는 Arrays.sort()를 활용한 오름차순 정렬, Collections.reverseOrder()를 활용한 내림차순 정렬, 그리고 이진 탐색(binary search) 까지 다루어 보겠다.

 

 

 

 

1. 정렬의 기본 개념

정렬(Sorting) 이란 데이터를 순서대로 배치하는 과정이다.

대표적인 정렬 방식에는 다음과 같은 종류가 있다.

오름차순 정렬 (Ascending Order)

  • 작은 값 → 큰 값으로 정렬
  • 예: {8, 10, 12, 4, 2, 0, 5} → {0, 2, 4, 5, 8, 10, 12}

내림차순 정렬 (Descending Order)

  • 큰 값 → 작은 값으로 정렬
  • 예: {8, 10, 12, 4, 2, 0, 5} → {12, 10, 8, 5, 4, 2, 0}

Java에서는 Arrays.sort()와 Collections.reverseOrder()를 활용하여 쉽게 정렬할 수 있다.

 


 

2. 예제 코드 분석

 

import java.util.Arrays;
import java.util.Collections;

public class SortExample {
    public static void main(String[] args) {
        /***********************************************************************/
        /************************** 정렬(sort) 연습 ******************************/
        /***********************************************************************/
        
        // 1. 기본 오름차순 정렬
        int val[] = {15, 3, 27, 9, 42, 18, 6};
        Arrays.sort(val);  // 오름차순 정렬
        
        System.out.println("오름차순 정렬 결과:");
        for (int i = 0; i < val.length; i++) {
            System.out.print(val[i] + ", ");
        }
        System.out.println("");

        // 2. 이진 탐색 (Binary Search)
        int searchValue = 18;
        int searchResult = Arrays.binarySearch(val, searchValue);
        System.out.println(searchValue + "는 " + searchResult + "번째에 위치함.");
        System.out.println("<= @@@@@@@@@@@@@@@@");

        // 3. Integer 배열을 사용한 정렬 (null 허용 가능)
        Integer arg[] = {15, 3, 27, 9, 42, 18, 6};
        
        // 오름차순 정렬
        Arrays.sort(arg);
        System.out.println("오름차순 정렬 결과:");
        for (int i = 0; i < arg.length; i++) {
            System.out.print(arg[i] + ", ");
        }
        System.out.println("<= @오름차순@@@@@@@@@@@@@@@");

        // 4. 내림차순 정렬
        Arrays.sort(arg, Collections.reverseOrder());  // 내림차순 정렬
        
        StringBuilder sb = new StringBuilder();
        System.out.println("내림차순 정렬 결과:");
        for (int i = 0; i < arg.length; i++) {
            sb.append(arg[i]);
            if (i < arg.length - 1) {
                sb.append(", ");
            }
        }
        System.out.print(sb);
        System.out.println("<= @내림차순@@@@@@@@@@@@@@@");
    }
}
 

 

3. 실행 결과 예상

 

오름차순 정렬 결과:
3, 6, 9, 15, 18, 27, 42, 
184번째에 위치함.
<= @@@@@@@@@@@@@@@@
오름차순 정렬 결과:
3, 6, 9, 15, 18, 27, 42, <= @오름차순@@@@@@@@@@@@@@@
내림차순 정렬 결과:
42, 27, 18, 15, 9, 6, 3 <= @내림차순@@@@@@@@@@@@@@@
 

4. 정렬 메서드 상세 설명

1️⃣ Arrays.sort() – 기본 오름차순 정렬

int val[] = {15, 3, 27, 9, 42, 18, 6};
Arrays.sort(val);
 

특징

  • 내부적으로 Dual-Pivot QuickSort(듀얼 피벗 퀵소트) 를 사용함.
  • 평균 시간 복잡도: O(N log N)
  • 최악의 경우 O(N²) (하지만 Java의 구현은 피벗을 최적화하여 거의 발생하지 않음).

 

 

💡 Dual-Pivot QuickSort란?

기존 퀵소트는 하나의 피벗을 기준으로 데이터를 나누지만,

Java에서는 2개의 피벗을 사용하여 더욱 최적화된 정렬을 수행함.

 

 


2️⃣ Arrays.binarySearch() – 이진 탐색

 

Arrays.binarySearch(val, 18);
 

특징

  • 반드시 정렬된 배열에서만 사용해야 함.
  • 평균 시간 복잡도: O(log N)
  • 값이 존재하면 해당 인덱스를 반환, 없으면 음수 값을 반환.

 

 

💡 왜 O(log N)인가?

이진 탐색(Binary Search)은 데이터를 반씩 나누면서 찾기 때문이다.

예를 들어, 100만 개의 데이터에서 이진 탐색을 하면 최대 20번만 비교하면 된다


3️⃣ Collections.reverseOrder() – 내림차순 정렬

 

Integer arg[] = {15, 3, 27, 9, 42, 18, 6};
Arrays.sort(arg, Collections.reverseOrder());
 

 

특징

  • 기본형 배열 int[] 에는 사용 불가 → 객체형 Integer[] 사용 필요함.
  • 내부적으로 Merge Sort(병합 정렬)와 Tim Sort(팀 정렬)의 혼합형을 사용한다.
  • 평균 시간 복잡도: O(N log N)

💡 Tim Sort란?

Tim Sort는 Merge Sort + Insertion Sort를 조합한 하이브리드 정렬 알고리즘으로,

Java에서는 작은 배열에 대해서는 삽입 정렬을 사용하여 최적화함.

 


5. 정렬 관련 꿀팁

1) List<Integer>의 정렬 방법

배열이 아니라 리스트를 정렬할 경우, Collections.sort()를 사용하면 된다.

 

List<Integer> list = Arrays.asList(15, 3, 27, 9, 42, 18, 6);
Collections.sort(list);  // 오름차순
Collections.sort(list, Collections.reverseOrder());  // 내림차순
 

 

✔ 2) 성능을 고려한 정렬 알고리즘 선택

  • Arrays.sort() : 내부적으로 Dual-Pivot QuickSort 사용.
  • Collections.sort() : 내부적으로 Merge Sort + Tim Sort 사용.
  • 대량 데이터 정렬 시 parallelSort() 사용 가능

 

Arrays.parallelSort(array);
 
  • → 멀티스레드를 활용하여 더 빠르게 정렬

 

 

✔3) 커스텀 정렬 (Comparator 활용)

만약 특정 기준으로 정렬하려면 Comparator 를 활용할 수 있다.

 

Arrays.sort(arr, (a, b) -> b - a); // 내림차순 정렬
 

 

6. 마무리

이번 포스팅에서는 Java의 정렬 기능을 살펴보았다.

쓰이는 부분은 한정적이지만 특수한 상황을 대비하여 기본 개념을 알아두는건 좋은 습관일듯 하다!

 

 

📌 정리

✅ Arrays.sort()를 사용하면 O(N log N) 정렬

✅ Collections.reverseOrder()는 Merge Sort 기반으로 O(N log N) 정렬

✅ Arrays.binarySearch()는 O(log N) 탐색

대량 데이터 정렬 시 parallelSort()를 고려하자!

 

 

 

오류나 궁금하신점은
아래 댓글로 알려주시면 감사하겠습니다.
728x90
반응형
LIST