[알고리즘] 삽입 정렬 (Insertion Sort) 이란?

2022. 7. 18. 23:25·알고리즘
728x90

삽입 정렬 (Insertion Sort) 란?

손 안의 카드를 정렬하는 방법과 유사하다.

2번째 원소부터 시작하여 그 앞(왼쪽) 원소들과 비교하여 삽입할 위치를 지정한 후, 원소를 뒤로 옮기고 지정된 자리에 자료를 삽입하여 정렬하는 알고리즘이다.

 

 

과정 (오름차순)

1. 정렬은 2번째 위치의 값을 temp에 저장한다.

2. temp와 이전에 있는 원소들과 비교하여 이전 값이 더 큰 경우 이전 값을 오른쪽으로 한 칸씩 이동하다가 그렇지 않은 경우 temp를 삽입한다.

3. 1번으로 돌아가 다음 위치의 값을 temp에 저장하고 반복한다.

 

 

Python Code

def insertion_sort(arr):
    n = len(arr)

    for i in range(1, n):
        temp = arr[i]
        prev = i-1
        while prev >= 0 and arr[prev] > temp: # 이전 원소가 temp보다 크면 오른쪽으로 이동시킨다.
            arr[prev+1] = arr[prev]
            prev -= 1

        arr[prev+1] = temp # temp보다 큰 값을 모두 왼쪽으로 이동시킨 후 값을 삽입한다.
    
    print(arr)

insertion_sort([5,4,3,2,1])

1. 첫 번째 원소 앞에는 원소가 없기 때문에, 두 번째 위치부터 탐색을 시작한다. temp에 i번째 값을 저장하고, prev에는 i 위치 이전의 위치(i-1)를 저장한다.

2. i-1를 가리키는 prev가 음수가 되지 않고, i-1값이 1번에서 선택한 temp보다 크다면, 왼쪽으로 이동시키고 prev를 -1하여 이전 위치를 가리키도록 한다.

3. 2번에서 반복문이 끝나고 나면 prev 위치의 값은 temp보다 작다는 의미이므로 prev+1 위치에 temp를 삽입한다.

 

 

시간복잡도

최악의 경우 Selection Sort와 마찬가지로 (n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2, 즉 O(n^2)이다.

하지만 모두 정렬이 되어있는 경우 한 번씩만 비교하므로 O(n)의 시간복잡도를 가지게 된다.

이미 정렬되어 있는 배열에 자료를 하나씩 삽입/제거하는 경우 최고의 정렬 알고리즘이 된다.

최선의 경우에는 O(n)의 시간복잡도를 갖고, 평균과 최악의 경우 O(n^2)의 시간복잡도를 갖게 된다.

 

 

공간복잡도

주어진 배열 안에서 교환(swap)을 통해 정렬이 수행되므로 O(n)이다.

 

 

장점

- 알고리즘이 단순하다.

- 대부분의 원소가 정렬되어 있는 경우, 효율적일 수 있다.

- 정렬하고자 하는 배열 안에서 교환하는 방식이므로, 다른 메모리 공간을 필요로 하지 않는다.

- Selecton Sort나 Bubble Sort와 같은 O(n^2) 알고리즘에 비교하여 상대적으로 빠르다.

 

 

단점

- 평균과 최악의 시간 복잡도가 O(n^2)으로 비효율적이다.

728x90

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

[알고리즘] 합병 정렬 (Merge Sort) 이란?  (0) 2022.07.18
[알고리즘] 퀵 정렬 (Quick Sort) 이란?  (0) 2022.07.18
[알고리즘] 선택 정렬 (Selection Sort) 이란?  (0) 2022.06.24
[알고리즘] 버블 정렬 (Bubble Sort) 이란?  (0) 2022.06.24
[알고리즘] '재귀 호출'과 '완전 탐색'으로 문제를 해결하는 방법, 재귀 호출 문제  (0) 2021.02.10
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 합병 정렬 (Merge Sort) 이란?
  • [알고리즘] 퀵 정렬 (Quick Sort) 이란?
  • [알고리즘] 선택 정렬 (Selection Sort) 이란?
  • [알고리즘] 버블 정렬 (Bubble Sort) 이란?
kiminae
kiminae
공부한 내용을 정리합니다.
  • kiminae
    데이터 다루는 사람
    kiminae
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • AI & 빅데이터 (6)
        • kafka (10)
        • [Book] 빅데이터를 지탱하는 기술 (12)
      • 알고리즘 (19)
      • 알고리즘 문제풀이 (13)
        • programmers (0)
        • 백준 (1)
        • LeetCode (12)
      • Android (3)
      • Book&Lesson (13)
        • [Lesson] 프로그래머스 커뮤러닝 (Pyth.. (1)
      • 참고한 글들 (1)
      • 컨퍼런스 정리 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BI도구
    데이터시각화
    mvvm
    빅데이터를지탱하는기술
    트리
    빅데이터
    정렬
    카프카
    파이프라인구축
    Kafka
    sort
    leetcode
    머신러닝
    ViewModel
    시간복잡도
    데이터엔지니어
    카프카클라이언트
    리트코드
    개인화추천
    알고리즘
    알고리즘문제
    알고리즘풀이
    hadoop
    버블정렬
    MPP데이터베이스
    정렬알고리즘
    추천알고리즘
    Algorithm
    릿코드
    DP문제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
kiminae
[알고리즘] 삽입 정렬 (Insertion Sort) 이란?
상단으로

티스토리툴바