ν μ λ ¬ (Heap Sort)
ν μ λ ¬μ μκ° λ³΅μ‘λκ° O(NlogN)μΈ μ λ ¬μΌλ‘, λ²λΈ / μ ν / μ½μ μ λ ¬μ λΉν΄ μ°μν μ±λ₯μ κ°μ§κ³ μλ€.
μ°μ ν μ λ ¬μ μ΄ν΄λ³΄μ.
νμ μλ£κ΅¬μ‘° μ€ νλλ‘, μ΄ 'Heap' μλ£κ΅¬μ‘°μ νΉμ±μ νμ©ν μ λ ¬ λ°©λ²μ΄λ€.
νμ μμ μ΄μ§νΈλ¦¬μ μΌμ’ μΌλ‘, μ¬λ¬ κ°λ€ μ€μμ μ΅μκ° νΉμ μ΅λκ°μ λΉ λ₯΄κ² μ°ΎκΈ° μν΄ μ€κ³λ μλ£κ΅¬μ‘°μ΄λ€.
νμ λμ¨ν μ λ ¬ μν(λ° μ λ ¬ μν)λ₯Ό μ μ§νκ³ , μ΄λ₯Ό μ½κ² νμ΄νλ©΄ λΆλͺ¨ λ
Έλμ ν€ κ°μ΄ μμ λ
Έλμ ν€ κ°λ³΄λ€ νμ ν°(μμ) μ΄μ§ νΈλ¦¬λ₯Ό λ§νλ€.
λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ ν° μ§, μμ μ§μ λ°λΌ νμ μ’ λ₯κ° λλλ€.
- μ΅λ ν (Max Heap) : λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ ν° ν β λ£¨νΈ λ Έλμ κ°μ₯ ν° μμκ° μμΉνκ² λλ€.
- μ΅μ ν (Min Heap) : λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ μμ ν β λ£¨νΈ λ Έλμ κ°μ₯ μμ μμκ° μμΉνκ² λλ€.

ν μ λ ¬μ μκ³ λ¦¬μ¦μ λ¨μνκ² λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
1. μ λ ¬νκ³ μ νλ λ°°μ΄μ νμΌλ‘ λ§λ λ€. (μ΄ κ³Όμ μ heapifyλΌκ³ νλ€.)
2. μ λ ¬λ μμλ€μ΄ μ μ₯λ μλ‘μ΄ λ°°μ΄μ μμ±νλ€. (μ΄ λ°°μ΄μ μ λ ¬ λ°°μ΄μ΄λΌ λΆλ₯΄μ.)
3. νμ 루νΈλ Έλμ κ°μ μ λ ¬ λ°°μ΄μ appendνκ³ , λ£¨νΈ λ Έλμ κ°μ μμ νλ€.
4. μμ ν ν λλ¨Έμ§ νΈλ¦¬μ λν΄μ λ€μ νμΌλ‘ λ§λ λ€. (heapify)
5. νμ λ¨μ μμκ° νλλ μμ λκΉμ§ 3~4λ² κ³Όμ μ λ°λ³΅νλ€.
6. νμ λ¨μ μμκ° μμΌλ©΄, μ λ ¬ λ°°μ΄ μ μμλ€μ λͺ¨λ μ λ ¬μ΄ λμ΄μλ€. (Min Heapμ κ²½μ° μ€λ¦μ°¨μ, Max Heapμ κ²½μ° λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬μ΄ λλ€.)
ν μ λ ¬ νμ΄μ¬ μ½λ
""" | |
ν μ λ ¬ (Heap sort) | |
μ λ ¬νκ³ μ νλ λ°°μ΄μ ν μλ£κ΅¬μ‘°λ‘ λ§λ€κ³ , μ΄μ νΉμ±μ μ΄μ©ν μ λ ¬ | |
""" | |
def heapify(li, idx, n): | |
# li : νμΌλ‘ λ§λ€κ³ μ νλ λ°°μ΄ | |
# idx : μ νλ λ Έλ | |
# n : νμ λ²μ | |
# μμμ μΌμͺ½ λ Έλλ₯Ό μλ―Έ | |
left = idx * 2 | |
# μμμ μ€λ₯Έμͺ½ λ Έλλ₯Ό μλ―Έ | |
right = idx * 2 + 1 | |
s_idx = idx | |
# μ ν λ Έλ, μ ν λ Έλμ μ μμ μ€ κ°μ₯ μμ κ°μ μ°Ύλ κ³Όμ | |
if left <= n and li[s_idx] > li[left]: | |
s_idx = left | |
if right <= n and li[s_idx] > li[right]: | |
s_idx = right | |
# μ ν λ Έλμ μμ λ Έλμ μμΉκ° λ°λμ΄μΌ νλ€λ©΄ | |
if s_idx != idx: | |
# λΆλͺ¨ μμ μμΉ λ³κ²½ | |
li[idx], li[s_idx] = li[s_idx], li[idx] | |
# λΆλͺ¨κ° μμμΌλ‘ λ΄λ €κ° μ΄νμλ, κ·Έ μμκ³Ό λ°λ μ¬μ§κ° μλμ§ μ¬κ·λ‘ μ²΄ν¬ | |
return heapify(li, s_idx, n) | |
def heap_sort(array): | |
n = len(array) | |
# 루νΈλ Έλλ index 1λΆν° μμνλ―λ‘, μμ 0 μμλ₯Ό μΆκ°ν μ±λ‘ μμ. | |
array = [0] + array | |
# μ΅μ’ μ λ ¬λ μμλ€μ΄ μ μ₯λ λ°°μ΄ | |
ans = [] | |
# Min Heapμ λ§λλ κ³Όμ | |
for i in range(n//2, 0, -1): | |
heapify(array, i, n) | |
# λ£¨νΈ λ Έλ μμλ₯Ό μ λ ¬ λ°°μ΄μ μ μ₯, heapify λ°λ³΅ | |
for i in range(n, 0, -1): | |
ans.append(array[1]) | |
array[i], array[1] = array[1], array[i] | |
heapify(array, 1, i-1) | |
# array[1:]λ₯Ό μ»μΌλ©΄ μ€λ¦μ°¨μ μ λ ¬ λ°°μ΄μ μ»μ μ μμ | |
return ans | |
print(heap_sort([3, 4, 5, 2, 1, 6, 7])) |
ν μ λ ¬ μλ° μ½λ
/* | |
* ν μ λ ¬ (Heap sort) | |
* μ λ ¬νκ³ μ νλ λ°°μ΄μ ν μλ£κ΅¬μ‘°λ‘ λ§λ€κ³ , μ΄μ νΉμ±μ μ΄μ©ν μ λ ¬ | |
*/ | |
private void solve() { | |
int[] array = { 7, 3, 4, 2, 1, 5, 6 }; | |
heapSort(array); | |
for (int v : array) { | |
System.out.println(v); | |
} | |
} | |
public static void heapify(int array[], int n, int i) { | |
int p = i; | |
// μμ μΌμͺ½ λ Έλ | |
int l = i * 2 + 1; | |
// μμ μ€λ₯Έμͺ½ λ Έλ | |
int r = i * 2 + 2; | |
// λΆλͺ¨, μμ μ€ κ°μ₯ μμ κ° νμ | |
if (l < n && array[p] > array[l]) { | |
p = l; | |
} | |
if (r < n && array[p] > array[r]) { | |
p = r; | |
} | |
// λΆλͺ¨ μμ κ΄κ³ λ°λμ΄μΌ νλ€λ©΄ | |
if (i != p) { | |
// λΆλͺ¨ μμ μμΉ λ³κ²½ | |
swap(array, p, i); | |
// μμΉ λ³κ²½ μ΄νμλ κ·Έ μμκ³Ό λ³κ²½λ μ¬μ§ μλμ§ μ¬κ·λ‘ νμΈ | |
heapify(array, n, p); | |
} | |
} | |
public static void heapSort(int[] array) { | |
int n = array.length; | |
// μ΅μ ν μμ± | |
for (int i = n / 2 - 1; i >= 0; i--) { | |
heapify(array, n, i); | |
} | |
// μ΅μ νμμ μΆμΆ, λλ¨Έμ§ λ°°μ΄ λ€μ νμΌλ‘ μ¬κ΅¬μ± | |
for (int i = n - 1; i > 0; i--) { | |
swap(array, 0, i); | |
heapify(array, i, 0); | |
} | |
} | |
public static void swap(int[] array, int a, int b) { | |
int temp = array[a]; | |
array[a] = array[b]; | |
array[b] = temp; | |
} |
ν μ λ ¬ μ₯λ¨μ
μ₯μ
- νμ O(NlogN)μ 보μ₯
- max λλ min κ°μ ꡬν λ μκ° λ³΅μ‘λλ O(1)μ΄λ€.
λ¨μ
- μΌλ°μ μΌλ‘ μλλ§ λΉκ΅νμλ©΄ ν΅μ΄ νκ· μ μΌλ‘ λ λΉ λ₯΄λ€. κ·Έλμ μ μ¬μ©νμ§ μμ.
'π§ͺ μ»΄ν¨ν°κ³Όν : CS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°] Arrayμ LinkedListμ μ°¨μ΄ (μΈν°λ·° λλΉ) (0) | 2022.10.23 |
---|---|
[κ°λ°κ³΅ν΅] Call by valueμ Call by reference (Java, Python, C/C++) (0) | 2022.10.11 |
[Alogrithm] μ½μ μ λ ¬ (Injection Sort) (0) | 2022.09.03 |
[Algorithm] μ ν μ λ ¬ (Selection Sort) (0) | 2022.09.03 |
[Algorithm] λ²λΈ μ λ ¬ (Bubble Sort) (0) | 2022.09.03 |