개발자의 공부/자료구조&알고리즘

[정렬 알고리즘]Insertion Sort

2022. 11. 7. 15:28
목차
  1. 삽입 정렬 알고리즘(Insertion Sort Algorithm)
  2. Bubble Sort 👊 Insertion Sort 👊 Selection Sort

삽입 정렬 알고리즘(Insertion Sort Algorithm)

앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입해서 배열의 정렬된 부분을 점진적으로 구축하는 알고리즘이다.

 

 

왜 삽입 정렬인지 애니메이션을 통해 알 수 있다. 한 번에 하나를 취해서 올바른 위치에 삽입하는 것이다.

 

 

 

 

 

 

 

 

 

 

 

의사코드

1. 배열의 두 번째 요소를 선택하여 시작한다. 왜냐하면 첫 번째 요소는 정렬된 부분으로 간주하기 때문이다.

2. 앞의 요소와 비교하고 필요하면 swap한다.

3. 다음 요소로 계속 이동한 후 순서가 잘못된 경우, 정렬된 부분을 반복하여 요소를 올바른 위치에 배치한다.

4. 배열이 정렬될 때까지 반복한다.

 

삽입 정렬 구현 과정

function insertionSort(arr) {
    for (let i = 1; i < arr.length; i++) {
        let currentVal = arr[i];
        for(let j = i-1; j >= 0; j--) {
            console.log(i, j)
        }
    }
    return arr
}

insertionSort([2,1,9,67,5])

실행 결과

해당 중첩 loop가 왜 저렇게 짜여졌는지, 실행 결과를 보면서 스스로 이해해보자.

앞으로 이루어져야할 것은 무엇인지에 대해서도 생각해보자. 

 

function insertionSort(arr) {
    for (let i = 1; i < arr.length; i++) {
        let currentVal = arr[i];
        for(var j = i-1; j >= 0 && arr[j] > currentVal; j--) {
            arr[j+1] = arr[j]
        }
        arr[j+1] = currentVal;
    }
    return arr
}

insertionSort([2,1,9,67,5])

정상적으로 동작하는 코드이다. currentVal는 삽입이 발생할 항목이며 arr[j]가 더 클 경우 loop가 지속된다. 

위 코드의 이해를 돕기위해 [1,2,9,55,20]에서 20을 삽입 해야한다. 즉, currentVal가 20일때, j는 3 즉, 55이다. 

loop내부의 동작 arr[j+1] = arr[j]으로 인해 [1,2,9,55,55]의 형태를 가지며 j는 -1하여 2가 즉, 9가 된다. 9는 55보다 작기 때문에 false가 되어 loop를 빠져나와 arr[j+1] = currentVal가 실행된다. 그렇기에 [1,2,9,20,55]의 정렬된 배열이 되는 것이다. 

 

삽입 정렬의 Big O 복잡도

삽입 정렬은 앞서 배운 두가지 정렬과 전반적으로 비슷하다. 완전히 reversed된 경우 최악이며, 데이터가 거의 정렬되어 있다면 꽤 좋다. 한가지 흥미로운 예시로 온라인에서 실시간으로 번호를 받는 코드가 있다고 한다면 삽입 정렬은 어떤 숫자가 입력되더라도 필요한 위치에 넣을 수 있다. 라이브, 스트리밍 방식으로 들어온 데이터를 즉시 입력해야하는 상황에 편리할 수 있다. 

 

Bubble Sort 👊 Insertion Sort 👊 Selection Sort

Algorithm Time Complexity Space
Complexity
Best Average Worst
Selection Sort O(n) O(n^2) O(n^2) O(1)
Bubble Sort O(n) O(n^2) O(n^2) O(1)
Selection Sort O(n^2) O(n^2) O(n^2) O(1)

이들을 기본 정렬 알고리즘 혹은 2차 정렬 알고리즘이라 한다. 앞으로 좀 더 어렵지만 성능적으로 우수할 수 있는 정렬들을 다루어볼 것이다.

저작자표시 비영리 동일조건 (새창열림)

'개발자의 공부 > 자료구조&알고리즘' 카테고리의 다른 글

[정렬 알고리즘]Quick Sort  (0) 2022.11.25
[정렬 알고리즘]Merge Sort  (0) 2022.11.18
[정렬 알고리즘]Selection Sort  (0) 2022.10.28
[정렬 알고리즘]Sorting Algorithm-BubbleSort  (0) 2022.10.23
[검색 알고리즘]Linear, Binary, Naive Search  (0) 2022.10.11
  1. 삽입 정렬 알고리즘(Insertion Sort Algorithm)
  2. Bubble Sort 👊 Insertion Sort 👊 Selection Sort
'개발자의 공부/자료구조&알고리즘' 카테고리의 다른 글
  • [정렬 알고리즘]Quick Sort
  • [정렬 알고리즘]Merge Sort
  • [정렬 알고리즘]Selection Sort
  • [정렬 알고리즘]Sorting Algorithm-BubbleSort
JMins
JMins
안녕하세요. 프론트엔드 개발자 김정민입니다. 개발 지식을 공유하고 기록하는 공간입니다.
JMins
개발자 노트
JMins
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자의 공부 (73)
      • React (17)
      • 자료구조&알고리즘 (28)
      • JS (17)
      • TS (8)
      • Nodejs (0)
      • Nextjs (1)
      • 기타 (1)
      • Design Pattenrs (0)
      • 테스트 및 최적화 (1)
    • 문제 및 해결 (9)
    • 기본 지식 (3)
    • 챌린지 (0)

블로그 메뉴

  • 홈

공지사항

  • #블로그 스킨 변경
  • 개인적으로 공부를 기록하기 위해 적고 있습니다.

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
JMins
[정렬 알고리즘]Insertion Sort
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.