Insertion Sort

Algorithm Tag

알고리즘에 대해 공부하기 위한 태그이다.


Insertion Sort

말로 풀어서 글을 쓰는 것 보단 직접 구현을 해보는게 빠를 것 같다.


Step by step

insertion1

첫 단계에서는 위와 같이 시작한다. 현재 2와 10을 비교해야 하고, U그룹의 10은 S그룹의 2보다 크기 때문에 10을 S그룹으로 보낸 뒤 비교 멈춘다.

Insertion sort의 핵심은, 적어도 S그룹에서의 배열은 정렬되었다는 것이다.


insertion1

2번째 단계이다.

이와 같이 U그룹의 모든 원소에 대해 반복을 해준다면 배열은 오름차순으로 깔끔하게 정렬이 될 것이다.


Time complexity


Selection sort와 비교해서 Best case인 경우에는 더 효율적이지만, 데이터가 많아질 때 O(N2)의 time complexity로써 2개의 알고리즘은 비효율적이다.


구현

import java.io.*;
import java.util.StringTokenizer;

// 3 4 2 5 6 1
public class InsertionSort {
    static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) { // N개의 data에 대해 탐색.
            int key = arr[i]; // U그룹의 첫번째 원소를 key 값으로 지정.

            for (int k = i - 1; k >= 0; k--) { // S그룹의 마지막 원소부터 첫번째 원소로 비교 시작.
                if (key < arr[k]) arr[k + 1] = arr[k]; // U그룹의 원소인 key가 현재 비교할 S그룹의 원소보다 작으면 S그룹의 원소 index를 +1
                else { // U그룹의 원소인 key가 S그룹의 원소보다 크다면, 즉시 비교를 멈추고 해당 index에 key값 insertion!
                    arr[k + 1] = key; // key값 insertion!
                    break; // 즉시 비교 멈춤.
                }
            }
        }
    }
}

위와 같이 코드를 구현할 수 있다.