예꾸
개발자국
예꾸
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • CS (6)
      • 데이터베이스 (5)
      • 운영체제 (0)
      • Computer Architecture (1)
    • 끄적끄적 (4)
    • 이론 (29)
      • 알고리즘 (18)
      • 자료구조 (4)
      • WEB (2)
      • JS (2)
      • Git (2)
      • Python (1)
    • 면접준비 (3)
      • Vue (1)
      • Design Pattern (1)
      • Frontend (1)
    • 개발기술 (20)
      • Git PUSH 자동화 (3)
      • VUE (1)
      • Linux (2)
      • MERN Stack (2)
      • React기반 Gatsby로 블로그 개발하기 (6)
      • Typescript (0)
      • 감정일기장(React) (3)
      • CI CD (3)
    • 코드트리 (6)
      • 블로그 챌린지 (3)
      • 모의시험 (3)
    • 취업준비 (3)
      • 코딩테스트 후기 (3)
    • 프로그래머스 (8)
      • SQL (7)
      • 알고리즘 (1)
    • 백준 (31)
      • 그리디(탐욕법) (6)
      • 구현 (5)
      • 그래프탐색(dfs, bfs) (5)
      • 완전탐색 (5)
      • 문자열 (5)
      • 누적합 (2)
      • DP(다이나믹 프로그래밍) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • JS
  • 백준 그래프탐색
  • React
  • 알고리즘
  • 백준 완전탐색
  • 코딩테스트실력진단
  • 백준 문자열
  • 백준 그리디
  • 코딩테스트
  • 프로그래머스 SQL
  • 코드트리 추천
  • 운영체제
  • gatsby
  • 코드트리
  • 백준 구현
  • 나만의공부노트
  • 프로그래머스
  • 자료구조
  • 컴퓨터 시스템의 구조
  • javascript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
예꾸

개발자국

[정렬] Insertion Sort - JS, Python
이론/알고리즘

[정렬] Insertion Sort - JS, Python

2021. 4. 17. 17:44

삽입정렬 알고리즘

삽입 정렬은 왼쪽에서 오른쪽으로 가면서 요소들을 왼쪽 요소들과 비교하여 알맞은 자리에 삽입하는 형식의 정렬 방법

주의  첫번째 값은 고정되어있음

출처 : 위키피디아

1. 첫번째 값을 고정시킨 채 오른쪽 값과 첫번째 값을 비교한다

2. 왼쪽 값이 오른쪽 값보다 크면 오른쪽 값을 왼쪽으로 삽입한다 (반복)

3. 만약 왼쪽값이 오른쪽 값보다 작은 경우 삽입을 멈춘 뒤 값을 고정시킨다

삽입정렬은 항상 왼쪽 비교 대상 데이터들이 정렬되어 있다는 가정하에 진행된다

Big O

  • 삽입 정렬 시간 복잡도는 O(N^2)이며, 선택정렬과 마찬가지로 반복문이 두 번 중첩되어 사용됨
  • 삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태면 매우 빠르게 동작

WORST O(N^2) - 값을 전부 비교하며 교환해야 하는 경우

 

BEST O(N) - 값이 정렬되어 있는 경우 

 

장점

삽입 정렬도 in place 알고리즘이기 때문에 메모리가 절약된다

선택정렬보다 구현하긴 살짝 까다롭다 하지만 선택 정렬과 다르게 이미 정렬된 데이터를 순회하는 경우 O(n)번만 순회하면 되기 때문에 정렬이 되었는지 안되었는지 테스트 하는 용도로 사용될 수 있음

* in place란?

자료를 정렬할 때 추가적인 메모리 공간이 필요한 것이 아니고 데이터가 저장된 그 공간 내에서 정렬을 한다는 뜻

단점

자료의 개수가 많아질수록 성능이 매우 떨어짐 (최악의 경우 O(n^2))

 

Python 코드

array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for i in range(1, len(array)): # 맨앞 고정
    for j in range(i, 0, -1): # idx i부터 1까지 1씩 감소하면서 반복
        if array[j] < array[j-1]: # j위치에 있는 값이 바로 앞의 값보다 작으면
            array[j], array[j-1] = array[j-1], array[j] # swap
        else: # 자기보다 작은 데이터를 만나면 고정  
            break

print(array)

 

JS 코드

let array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for (let i = 1; i < array.length; i ++) {
    for (let j = i; j > 0; j-- ) {
        if (array[j] < array[j-1]) {
            swap = array[j]
            array[j] = array[j-1]
            array[j-1] = swap
        }
        else {
            break
        }
    }
    console.log(`${i}번째 회전: ${array}`)
}

 

    '이론/알고리즘' 카테고리의 다른 글
    • [Python] 정렬 라이브러리
    • [정렬] Quick Sort - JS, Python
    • [정렬] Selection Sort - JS, Python
    • [JavaScript] 알고리즘에 쓰이는 문법 (판별)
    예꾸
    예꾸
    비전공자 옒의 개발이야기💻

    티스토리툴바