Topic

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

JackerLab 2025. 3. 29. 01:42
728x90
반응형

개요

삽입 정렬(Insertion Sort)은 정렬되지 않은 데이터를 하나씩 꺼내어 정렬된 부분에 삽입해가는 방식으로 작동하는 비교 기반 정렬 알고리즘이다. 카드 정렬 방식과 유사하며, 구현이 간단하고 작은 데이터 집합에서 매우 효과적이다. 또한 대부분의 경우에 안정 정렬로 분류되며, 부분 정렬이 되어 있는 경우 효율적이다.


1. 개념 및 정의

삽입 정렬은 다음과 같이 동작한다:

  • 두 번째 원소부터 시작해 이전 원소들과 비교
  • 정렬된 부분 중 적절한 위치를 찾아 값을 삽입
  • 이 과정을 배열 끝까지 반복

이미 정렬된 데이터에는 최소 연산만 수행되어 최적의 성능을 발휘한다.


2. 동작 원리

단계 설명
1단계 두 번째 원소부터 시작하여 이전 원소들과 비교
2단계 더 큰 값을 뒤로 이동시키며 빈 자리를 만들고 삽입
3단계 삽입 후 정렬된 영역은 한 칸 확장됨
4단계 마지막 원소까지 반복 수행

실제로는 버블 정렬보다 연산 횟수가 적을 수 있다.


3. 파이썬 구현 예시

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 사용 예시
print(insertion_sort([9, 5, 1, 4, 3]))

정렬된 부분을 기준으로 적절한 위치에 삽입하는 방식이다.


4. 시간 및 공간 복잡도

케이스 시간 복잡도
최선 (이미 정렬됨) O(n)
평균 O(n²)
최악 (역순 정렬) O(n²)
  • 공간 복잡도: O(1) (제자리 정렬)
  • 비교 및 이동 횟수: 상황에 따라 달라짐

5. 특징 및 장단점

항목 설명
구현 난이도 매우 낮음, 직관적 구조
안정 정렬 여부 O (동일 값의 순서 유지)
메모리 사용 O (in-place)
데이터가 거의 정렬됨 매우 빠름
대규모 데이터 비효율적 (n² 성능 한계)

입력 데이터가 거의 정렬되어 있으면 최고의 효율을 낼 수 있다.


6. 시각적 예시

초기 배열: [9, 5, 1, 4, 3]

  • 1회차: [5, 9, 1, 4, 3]
  • 2회차: [1, 5, 9, 4, 3]
  • 3회차: [1, 4, 5, 9, 3]
  • 4회차: [1, 3, 4, 5, 9] → 정렬 완료

7. 다른 정렬 알고리즘과 비교

알고리즘 시간 복잡도 안정 정렬 특징
삽입 정렬 O(n²) O 정렬된 상태에서 빠름
선택 정렬 O(n²) X 교환 횟수 적음
버블 정렬 O(n²) O 구현은 간단하나 느림
퀵 정렬 O(n log n) X 가장 빠른 비교 정렬 중 하나
병합 정렬 O(n log n) O 메모리 추가 필요, 안정적

삽입 정렬은 '정렬된 부분 유지'의 개념을 가장 잘 설명하는 알고리즘이다.


8. 활용 사례

분야 활용 예시
교육용 정렬 알고리즘 입문, 비교/이동 학습
소규모 데이터 삽입 정렬로 충분한 경우
실시간 정렬 새로 들어오는 항목을 실시간으로 정렬
정렬이 거의 된 데이터 빠른 처리 가능

삽입 정렬은 실시간 데이터 정렬과 정렬된 목록 유지에 적합하다.


9. 결론

삽입 정렬은 비교 기반 정렬 알고리즘 중 가장 이해하기 쉽고, 구현이 간단한 방식이다. 효율성은 떨어지지만, 입력 데이터가 거의 정렬되어 있을 때 빠르게 작동하며, 안정 정렬 특성으로 인해 중복 데이터를 다룰 때에도 안전하다. 알고리즘 기초를 학습하고 비교 정렬의 원리를 파악하는 데 있어 매우 유용한 알고리즘이다.

728x90
반응형