본문 바로가기
알고리즘

Insertion Algorith - 삽입 정렬

by alisherka 2023. 3. 17.

삽입 정렬은 카드 놀이를 할 때 손에 쥔 카드를 정렬하는 것과 방법이 같습니다.

왼손ㄴ은 비었고 카드가 탁자 위에 뒤집힌 채 쌓여 있다고 하자. 이제 탁자에서 카드를 한 장씩 가져와 왼손의 적절한 위치에 삽입합니다. 카드를 삽입할 적절한 위치를 찾기 위해 왼손에 이미 든 카드와 새 카드를 오른쪽ㅇ서 왼쪽에서 왼쪽 방향으로 차례로 비교하면 됩니다. 왼손에 있는 카드는 항상 정렬되어 있고, 이는 처음에 탁자에서 맨 위에 쌓였던 카드입니다.

입력: n개 수들의 수열(a1,a2,a3,a4...,an)

출력: a1<=a2<=a3<=a4...<=an 을 만족하는 입력 수열의 순열 (재배치) {a1,a2,a3,a4....,an}


배열 A = {5,1,8,3,9,2}에 대한 삽입 정렬의 수행 과정

1. 두 번째 자료인 1를 키로 해서 그 이전의 자료들과 비교한다.

  -> 키 값 1과 첫번째 자료인 5를 비교한다. 5 1보다 크므로 5를 1자리에 넣고 키 값 1을 5의 자리인 첫번째에 기억시킨다.

2. 세번째 자료인 8을 키 값으로 해서 그 이전의 자료들과 비교한다.

  -> 키 값 8과 두 번째 5를 비교한다. 5가 키 값보다 작으므로 그냥 넘어간다.

3. 네번째 3을 키 값으로 해서 그 이전의 자료와 비교한다.

  -> 키 값 3과 세 번째 자료인 8을 비교한다. 키 값보다 크므로 8을 3이 있던 네 번째 자리에 기억시킨다.

  -> 키 값 3와 세번째 두 번째 자료인 5를 비교한다. 키 값보다 크므로 5를 2가 있던 자리에 기억시킨다.

  -> 키 값 3와 첫번째 자료인 1을 비교한다. 키 값보다 작으므로 두 번째 자리에 기억시킨다.

4. 다섯번째 자료인 9을 키 값으로 해서 그 이전의 자료들과 비교한다.

  -> 키 값 9을 네 번째 자료인 8을 비교한다. 8일 키 값보다 작으므로 9을 다섯번째 자리에 기억시킨다.

5. 여섯번째 자료인 2를 키 값으로 해서 그 이전의 자료드과 비교한다.

  -> 키 값 2를 다섯번째 9을 비교한다. 9이 키 값보다 크므로 9을 2가 있던 자리에 기억시킨다.

  -> 키 값 2를 네 번째 8을 비교한다. 8이 키 값보다 크므로 8을 2가 있던 자리에 기억시킨다.

  -> 키 값 2를 세 번째 5를 비교한다. 5가 키 값보다 크므로 5를 2가 있던 자리에 기억시킨다.

  -> 키 값 2를 두 번째 3을 비교한다. 3이 키 값보다 크므로 3을 2가 있던 자리에 기억시킨다.

  -> 키 값 2를 첫 번째 1을 비교한다. 1을 키 값보다 작으므로 2를 두 번째 자리에 기억시킨다.

 

Insertion sort - 삽입 정렬 유스코드

오름차순

for j = 2 to A.length
	key = A[j]
    // A[j]를 정렬된 배열 A[1..j-1]에 삽입한다.
    i = j - 1
    while i > 0 그리고 A[i] > key
    	A[i+1] = A[i]
        i = i - 1
    A[i+1] = key

내림차순

for j = 2 to A.length
	key = A[j]
    // A[j]를 정렬된 배열 A[1..j-1]에 삽입한다.
    i = j - 1
    while i > 0 그리고 A[i] < key
    	A[i+1] = A[i]
        i = i - 1
    A[i+1] = key

 

자바 소스코드

public class InsertionSort {

    public static void main(String[] args) {
        int[] nums = { 5, 2, 4, 6, 1, 3 };
        System.out.print("List before -> : ");
        for (int i : nums) {
            System.out.print(i + ", ");
        }
        for (int j = 1; j < nums.length; j++) {
            int key = nums[j];
            int i = j - 1;
            while (i >= 0 && nums[i] < key) {
                nums[i + 1] = nums[i];
                i = i - 1;
            }
            nums[i + 1] = key;
        }
        System.out.println();
        System.out.print("Insertion Sort After Sorting -> ");
        for (int i : nums) {
            System.out.print(i + ", ");
        }
    }

}

결과 값 -> 

 

복잡도

n개의 데이터가 있을 때, 최악의 경우에는

번의 비교를 하게 되므로,

최악 시간 복잡도는  -> O(n2) 비교 및 교환

최선 시간 복잡도는 -> O(n) 비교, O(1)교환

평균 시간 복잡도는 -> O(n2) 비교 및 교환

공간 복잡도 -> O(n) 전체, O(1) 보조

 

'알고리즘' 카테고리의 다른 글

버블 정렬 - 알고리즘  (0) 2022.09.06