[Java] 정렬 알고리즘 정리

2025. 7. 2. 18:46·Backend/Java

정렬

  • 선형 자료구조는 순서가 중요하다.
  • 정렬이란 순서를 바꾸는 것
    • 오름차순 정렬 ascending
    • 내림차순 정렬 descending

    • 알고리즘 별 성능표
      name best average worst
      bubble n n^2 n^2
      insertion n n^2 n^2
      selection n^2 n^2 n^2
      quick nlogn nlogn n^2
      merge nlogn nlogn nlogn

1) bubble sort 버블정렬

개념

  • for문을 통해 가장 작은 값을 찾고, 맨 앞자리와 교환
  • 다음 for문에선 맨 앞자리 값을 제외한 값 중 가장 작은 값을 찾고, 두번째 앞자리와 교환
  • 이 작업을 최대 n - 1 번 반복하면 정렬 완료
  • 시간복잡도 : O(n^2)

ex) 3 1 5 2 4 를 정렬한다고 가정

  • 1번째 loop ⇒ 31524 / 13524 / 13524 / 13524 1확정
  • 2번째 loop ⇒ 13524 / 13524 / 12534 2확정
  • 3번째 loop ⇒ 12534 / 12354 3확정
  • 4번째 loop ⇒ 12354 / 4확정
  • 5번째 loop ⇒ 12345
    private static void bubbleSort(int[] array) {
         for(int i=0; i<array.length-1; i++){
            for(int j=0; j< array.length-1-i; j++){
                if(array[j] > array[j+1]) swap(array, j, j+1);
            }
        }
    }

 

2) Insertion sort 삽입정렬

개념

  1. 가장 처음 값은 자리를 확정해둔다.
  2. 왼쪽 자리들과 값을 비교해나간다.
  3. (자신보다 작은 값이 나오기 전까지 자리를 바꿔나간다.)
  4. 작은 값이 나왔을 경우 다음 분기로 넘어간다.
  • 시간복잡도 : O(n^2)

ex) 3 1 5 2 4 를 정렬한다고 가정

  • 3은 확정하고 시작
  • 1번째 loop ⇒ 3 1 5 2 4 / 1 3 5 2 4
  • 2번째 loop ⇒ 1 3 5 2 4
  • 3번째 loop ⇒ 1 3 5 2 4 / 1 3 2 5 4 / 1 2 3 5 4
  • 4번째 loop ⇒ 1 2 3 5 4 / 1 2 3 4 5
    private static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            for (int j = i-1; j >= 0; j--) {
                if (array[j] < array[j+1]) break;
                else swap(array, j, j+1);
            }
        }
    }

3) Selection sort 선택정렬

개념

  • 최소 값을 찾아 가장 왼쪽에 두는 방법
  • 범위 내의 최소 값을 찾아 가장 왼쪽 값과 자리를 바꾼다
  • 시간복잡도 : O(n^2)

ex) 3 1 5 2 4 를 정렬한다고 가정

  • 1번째 loop ⇒ 3 1 5 2 4 → 1 3 5 2 4
  • 2번째 loop ⇒ 1 3 5 2 4 → 1 2 5 3 4 / 가장 왼쪽인 3과 자리바꿈
  • 3번째 loop ⇒ 1 2 5 3 4 → 1 2 3 5 4
  • 4번째 loop ⇒ 1 2 3 5 4 → 1 2 3 4 5
  • 5번째 loop ⇒ 1 2 3 4 5 → 1 2 3 4 5
    private static void selectionSort(int[] array) {
        for(int i=0; i< array.length-1; i++){
            int min = i;
            for(int j=i+1; j< array.length; j++){
                if(array[min] > array[j]) {
                    min = j;
                }
            }
            swap(array, i, min);
        }
    }

 

4) Quick sort 퀵 정렬

개념

  • 큰거는 큰것끼리 작은거는 작은 것끼리 구분해서 처리한다
  • Pivot을 설정하고 이보다 큰 값과 작은 값을 설정
  • 시간복잡도 : O(nlogn) 회를 거듭할 수록 범위가 절반씩 줄어든다
  • ex) 3 1 5 2 4 를 정렬한다고 가정
    • 숫자 하나를 pivot으로 설정 → 5
    • [3 1 2 4] [5] [] pivot을 기준으로 분리
    • [1] [2] [3 4] 양쪽 값에서 pivot을 설정하고 또 나눔
    • [][1][] 확정 / [3] [4] [ ] 숫자가 하나 뿐이라면 확정
    • [] [3] [] 확정 합치기 시작

4) Merge sort 병합정렬

개념

  • 원소가 하나가 될때까지 나누고 병합한다.
  • 하나씩 병합하며 정렬해나간다. 병합 시 작은 값을 먼저 삽입한다
  • 시간복잡도 : O(nlogn)
  • ex) 3 1 5 2 4 를 정렬한다고 가정
    • [3 1 5 2 4] → [3 1] [5 2 4] → [3] [1] [5] [2 4] → [3] [1] [5] [2] [4]
    • [1 3] [5] [2 4] → [1 3] [2 4 5] → [1 2 3 4 5]
    • 왼쪽부터 순서대로 값을 비교하며 삽입
      • 한쪽 값이 비었다면 반대쪽 값 모두 삽입

'Backend > Java' 카테고리의 다른 글

[Java] StringTokenizer 란?  (0) 2025.07.10
[Java] BufferedReader, BufferedWriter 란?  (0) 2025.07.10
[EffectiveJava] Item 14. Comparable을 구현할지 고려하라  (1) 2025.07.01
[EffectiveJava] Item 55. 옵셔널 반환은 신중히 하라  (1) 2025.07.01
[EffectiveJava] item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라  (0) 2025.07.01
'Backend/Java' 카테고리의 다른 글
  • [Java] StringTokenizer 란?
  • [Java] BufferedReader, BufferedWriter 란?
  • [EffectiveJava] Item 14. Comparable을 구현할지 고려하라
  • [EffectiveJava] Item 55. 옵셔널 반환은 신중히 하라
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (110) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (17) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (78)
        • Programmers (78)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    CS
    java
    codingtest
    programmers
    BufferedReader
    BufferedWriter
    StringTokenizer
    switch
    json
    effectivejava
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[Java] 정렬 알고리즘 정리
상단으로

티스토리툴바