삽입 정렬(Insertion Sort)

김주영·2023년 3월 28일
0

🌱 삽입 정렬(Insertion Sort)


이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식

시간 복잡도 : O(N^2)

느린 편 + 구현이 쉬움

핵심 : 선택 데이터를 현재 정렬된 데이터 범위 내에서 적절한 위치에 삽입하는 것

🌿 정렬 과정

  1. 현재 index에 있는 데이터 값을 선택
  2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색
  3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행
  4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++연산을 수행
  5. 전체 데이터의 크기만큼 index가 커질 때까지, 즉 선택할 데이터가 없을 때까지 반복

적절한 삽입 위치를 탐색하는 부분에서 이진 탐색 등과 같은 탐색 알고리즘을 사용하면 시간 복잡도를 줄일 수 있다.

🌿 알고리즘

public class InsertionSort {

    public static void main(String[] args) throws IOException {
        int N = readInt();

        int[] A = new int[N];
        int[] S = new int[N];

        for (int i = 0; i < N; i++) A[i] = readInt();

        for (int i = 1; i < N; i++) {
            int insertion_point = i;
            int insertion_value = A[i];
            for (int j = i - 1; j >= 0; j--) {
                if (A[j] < A[i]) {
                    insertion_point = j + 1;
                    break;
                }
                if (j == 0) insertion_point = 0;
            }
            for (int j = i; j > insertion_point; j--) {
                A[j] = A[j - 1];
            }
            A[insertion_point] = insertion_value;
        }

        S[0] = A[0];
        for (int i = 1; i < N; i++) {
            S[i] = S[i - 1] + A[i];
        }

        int sum = 0;
        for (int i = 0; i < N; i++) {
            sum += S[i];
        }

        System.out.println(sum);
    }

    static int readInt() throws IOException {
        int c, n = System.in.read() & 15;
        while ((c  = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);
        return n;
    }

}

ref : Do It 알고리즘 코딩 테스트 자바편 by 김종관

0개의 댓글