삽입 정렬 "특정한 테이터를 적절한 위치에 '삽입'한다"

2021. 4. 1. 10:54·알고리즘 공부/정렬

선택 정렬은 알고리즘 문제 풀이에 사용하기에는 느린편이다.

 

'데이터를 하나씩 확인하며, 각 데이터를 적절한 위치에 삽입하면 어떨까?'

 

삽입 정렬은 선택 정렬처럼 동작 원리를 직관적으로 이해하기 쉬운 알고리즘이다.

삽입 정렬은 특정한 데이터를 적절한 위치에 '삽입'한다는 의미이다.

 

삽입 정렬 특징

1) 데이터가 거의 정렬 되어 있을 때 효율적이다.

2) 삽입 정렬은 특정 데이터가 적절한 위치에 들어가기 전, 그 앞까지의 데이터는

이미 정렬되어 있다고 가정한다.

3) 정렬되어 있는 데이터 리스트에서 적절한 위치를 찾은 뒤에, 그 위치에 삽입된다는 점이 특징

 

예시 

step0) 첫 번째 데이터 '7'은 그 자체로 정렬되어 있다고 판단하고, 두 번째 데이터인 '5'가 어떤 위치로 들어갈지 판단한다. '7'의 왼쪽으로 들어가거나 혹은 오른쪽으로 들어가는 두 경우만 존재, 우리는 카드를 오름차순으로 정렬하고자 '7'의 왼쪽에 삽입한다.

7 5 9 0 3 1 6 2 4 8

 

step1) 이어서 '9'가 어떤 위치에 들어갈지 판단한다. 삽입될 수 있는 위치는 총 3가지이며 현재 '9'는 '5'와 '7'보다 크기 때문에 원래 자리 그대로 둔다.

5 7 9 0 3 1 6 2 4 8

 

step2) 이어서 '0'이 어떤 위치에 들어갈지 판단한다. '0'은 '5', '7', '9'과 비교했을 땨 가장 작기 때문에 첫번째 위취에 삽입한다.

5 7 9 0 3 1 6 2 4 8

 

반복

 

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): # 인덱스 i부터 1까지 1씩 감소하며 반복하는 문법
        if array[ j] < array[ j - 1]: # 한 칸씩 왼쪽으로 이동
            array[ j], array[ j - 1] = array[j - 1], array[j]
        else: # 자기보다 작은 데이터를 만나면 그 위치에서 멈춤
            break

print(array)

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

 

이 예제에서 헷갈린 부분

i 와 j 의 부분이 헷갈렸다. i 는 계속해서 늘어나고 j 는 주어진 i 부터 -1 씩 줄어든다.

줄어든 j 값을 기준으로 한 칸씩 이동 시킨 후(계속해서 더 큰값을 만나면 이동 시킨다.)

지금 값 j 보다 작은 데이터를 만나면 그 위치에서 멈춘다.

 

선택정렬과 차이가 있음을 인지해야한다. 

선택정렬은 특정 값을 만나면 그값과 바꾸는 것이다.

 

 

<출처> 이 것이 코딩 테스트다 (나동빈 지음)

반응형

'알고리즘 공부 > 정렬' 카테고리의 다른 글

선택 정렬 '가장 작은 것을 선택'  (0) 2021.04.01
정렬 "연속된 데이터를 기준에 따라서 정렬하기 위한 알고리즘"  (0) 2021.03.31
'알고리즘 공부/정렬' 카테고리의 다른 글
  • 선택 정렬 '가장 작은 것을 선택'
  • 정렬 "연속된 데이터를 기준에 따라서 정렬하기 위한 알고리즘"
코딩 코딩 코오딩
코딩 코딩 코오딩
  • 코딩 코딩 코오딩
    코딩하는 누누
    코딩 코딩 코오딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (491)
      • 생산성 (2)
        • 인텔리제이 (2)
      • 프로젝트 기록 (14)
        • git (2)
        • spring (3)
        • TestCode (2)
        • spring security (3)
        • 기타 (2)
        • MySQL (0)
        • Cloud (2)
      • 회고 (4)
      • Spring (6)
      • JPA (0)
      • DB (4)
        • MySql (2)
        • Redis (1)
      • Java (7)
        • JSP (1)
      • 잡담 (1)
      • CS (30)
        • 컴퓨팅 사고 (0)
        • 배열 (4)
        • 알고리즘 (8)
        • 메모리 (7)
        • 자료구조 (9)
        • 암호학 (2)
      • opencv (14)
      • AI (56)
        • 머신러닝 (2)
        • 딥러닝 (7)
        • tensorflow (3)
        • 머신러닝(딥러닝) 정리 (21)
        • 강화학습 (7)
        • 논문 읽기 (1)
        • 잡동사니 (1)
        • python AI (13)
        • 선형대수 (1)
        • 확률론 (0)
      • 알고리즘 공부 (177)
        • 그래프 이론 (0)
        • 다익스트라 (4)
        • 위상정렬 (3)
        • 신장트리-크루스칼 알고리즘 (4)
        • 플로이드 워셜 (3)
        • 이진탐색 (9)
        • 백트래킹 (11)
        • 부르드포스 (9)
        • 다이나믹 프로그래밍 (20)
        • BFS & DFS (24)
        • 그리디 (6)
        • 구현 (15)
        • 정렬 (3)
        • 기타 (62)
        • 수학? (1)
      • 코딩 (173)
        • 파이썬(python) (15)
        • c언어 (13)
        • 프로그래머스 lv1 (46)
        • 프로그래머스 lv2 (41)
        • 백준 - c++ (49)
        • Softeer (9)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    if문
    알고리즘
    정렬
    코딩기초스킬
    백준
    선택정렬
    그리디
    다이나믹 프로그래밍
    BFS
    C언어 기초
    순차 탐색
    이미지처리
    큐
    코딩기초
    삽입 정렬
    코딩테스트
    코딩문제
    소수찾기
    에라토슽네스의 체
    인접리스트
    캘리브레이션
    자료구조
    왜곡보정
    스택
    c언어
    코딩
    인접행렬
    DFS
    프로그래머스
    n진법 변환
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩 코딩 코오딩
삽입 정렬 "특정한 테이터를 적절한 위치에 '삽입'한다"
상단으로

티스토리툴바