알고리즘

내가 공부하기 위한 공간 - [알고리즘] 13 - 정렬(힙, 기수)

AbiTindt 2025. 5. 13. 19:00
반응형

[힙 정렬]

배열을 완전 이진트리로 구성

맥스/민 힙으로 재구성 후 루트와 마지막 노드를 교환하는 작업을 반복하여 오름차순/내림차순으로 정렬

[8 5 9 1 3]

8

5 9

1 3

맥스 힙으로 재구성

9

5 8

1 3

9와 3을 교체

3

5 8

1 9

9는 정렬되어 있는 상태이므로 제외하고 맥스 힙

8

5 1

3 9

9과 3을 교체

3

5 1

8 9

이를 반복하면

1

3 5

8 9

[1 3 5 8 9]

 

<유사코드>

힙정렬(배열 A)
    최대힙_만들기(A)
    for i ← A의 길이부터 2까지 감소하면서
        A[1]과 A[i]를 교환
        힙 크기 ← 힙 크기 - 1
        최대힙_정리(A, 1)

최대힙_만들기(배열 A)
    힙 크기 ← A의 길이
    for i ← (A의 길이 ÷ 2)부터 1까지 감소하면서
        최대힙_정리(A, i)

최대힙_정리(배열 A, 정점 i)
    왼쪽 ← 왼쪽자식(i)
    오른쪽 ← 오른쪽자식(i)
    
    만약 왼쪽 ≤ 힙 크기이고 A[왼쪽] > A[i]이면
        가장큰값 ← 왼쪽
    아니면
        가장큰값 ← i
    
    만약 오른쪽 ≤ 힙 크기이고 A[오른쪽] > A[가장큰값]이면
        가장큰값 ← 오른쪽
    
    만약 가장큰값 ≠ i이면
        A[i]와 A[가장큰값]을 교환
        최대힙_정리(A, 가장큰값)

왼쪽자식(i) = 2 × i  
오른쪽자식(i) = 2 × i + 1

시간복잡도 O(nlogn)

 

 

[기수정렬]

각 자릿수 별로 정렬

일의자리 정렬 후 십의자리 정렬 후 … n자릿수 정렬

[17 192 26 9 108 7]

일의자리 정렬

192

026

017

007

108

009

십의자리 정렬

007

108

009

017

026

192

백의자리 정렬

007

009

017

026

108

192

 

<유사코드>

기수정렬(배열 A, 최대자릿수 d)
    for i ← 1부터 d까지  // i: 현재 자릿수 (1의 자리 → 10의 자리 → ...)
        자리수별_안정정렬(A, i)

자리수별_안정정렬(배열 A, 자릿수 i)
    0부터 9까지의 빈 큐 큐[0..9] 만들기

    for 각 원소 x in A
        digit ← x의 i번째 자릿수
        큐[digit]에 x를 넣기

    A를 큐[0]부터 큐[9]까지 차례대로 꺼내서 다시 구성

시간복잡도 O(n)

반응형