ν
νμ λ ¬μ μ΄ν΄νκΈ° μ μ νμ λν μ΄ν΄κ° νμνλ€. νμ μ΄ν΄νκΈ° μν΄μ λ€μ ν¬μ€νΈλ₯Ό νμΈν΄λ³΄μ.
https://ybdeveloper.tistory.com/132
ν μ λ ¬μ΄λ?
Max Heap, Min Heapμ ꡬμ±ν΄ μ λ ¬νλ λ°©λ²μ΄λ€.
λ΄λ¦Όμ°¨μ μ λ ¬μ μν΄μλ Max Heap, μ€λ¦μ°¨μ μ λ ¬μ μν΄μλ Min Heapμ ꡬμ±νλ©΄ λλ€.
μ¦, λ°μ΄ν°λ€μ Max Heapμ΄λ Min Heap ννλ‘ μ μ§ν μ± λ£¨νΈ λ Έλμ λ°μ΄ν°λ₯Ό λ½μλ΄ μ λ ¬μ νλ λ°©μμ΄λ€.
ν μ λ ¬ ꡬν (λ΄λ¦Όμ°¨μ)
1. nκ°μ λ°μ΄ν°μ λν΄ λ°λ³΅νλ€. O(n)
1-1. λ°°μ΄μ λ°μ΄ν°λ₯Ό μ½μ νλ©° Max-Heap νΉμ±μ λ§μ‘±νλλ‘ μ‘°μ νλ€. O(lgn)
2. Max-Heapμ λ°μ΄ν°κ° μ‘΄μ¬νμ§ μμ λ κΉμ§ λ°μ΄ν°λ₯Ό λ½μλΈλ€. O(n)
ν μ λ ¬ JAVAλ‘ κ΅¬ννκΈ°
public void insert(int n) {
heap[idx] = n;
int parent = idx/2;
int child = idx;
while(child >= 2 && heap[parent] < heap[child]) {
SWAP(parent, child);
child = parent;
parent = child/2;
}
idx++;
}
public int delete() {
int data = heap[1];
heap[1] = heap[idx--];
int parent = 1;
int child = 2;
while(child <= idx && heap[parent] < heap[child]) {
SWAP(parent, child);
parent = child;
child = heap[heap[parent * 2] < heap[parent * 2 + 1] ? parent * 2 + 1 : parent * 2];
}
return data;
}
public void SWAP(int idx1, int idx2) {
int temp = heap[idx1];
heap[idx1] = heap[idx2];
heap[idx2] = temp;
}
μ μ½λλ Max Heapμ ꡬνν μ½λμ΄λ€. Max Heapμ λ°μ΄ν°λ₯Ό μ½μ νκ±°λ, μμ ν΄λ νΉμ±μ μ μ§νκ³ μ΅μλ¨ λ£¨νΈ λ Έλμλ κ°μ₯ ν° κ°μ κ°μ§ λ Έλκ° μμΉνκ² λλ€. λ°λΌμ ν μ λ ¬μ ꡬννκΈ° μν΄μλ λ¨μν νμ νΉμ±μ νμ©νμ¬ κ°μ₯ 맨 μμ μλ λ£¨νΈ λ Έλμ λ°μ΄ν°λ₯Ό κ°μ Έμ μΆλ ₯ μμΌμ£ΌκΈ°λ§ νλ©΄ μ λ ¬λ λ°μ΄ν°λ₯Ό μ»μ μ μλ€.
μ΄λ₯Ό ꡬνν μ½λλ μλμ κ°λ€.
public void sort() {
int temp = heapSize;
for(int i=0; i<temp; i++) {
System.out.print(delete() + " ");
}
}
νμ λ ¬μ μκ° λ³΅μ‘λ
λ°μ΄ν° μ½μ
λ°μ΄ν°λ₯Ό μ½μ νλ μμ μ μ΅μ μ κ²½μ° λͺ¨λ Levelμ λ Έλμ λν΄ λΉκ΅ μ°μ°μ μ§νν΄μΌ νλ―λ‘ O(lgn)μ΄λ€. κ·Έλ°λ° λ°μ΄ν° μ½μ μμ μ λͺ¨λ λ°μ΄ν°μ λν΄ λ°λ³΅νλ―λ‘ O(n * lgn) μ΄λΌκ³ ν μ μλ€.
λ°μ΄ν° μμ
λ°μ΄ν°λ₯Ό μμ νλ μμ μ μ΅μ , μ΅μ λͺ¨λ O(1)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ³ μλ€. λ°μ΄ν° μμ μμ λν λͺ¨λ λ°μ΄ν°μ λν΄ λ°λ³΅νλ―λ‘ O(n * 1) μ΄μ§λ§, λ°μ΄ν°κ° 무νλλ‘ μ»€μ§λ€λ©΄ O(n)μ O(n * lgn)μ λΉν΄ ν° μν₯μ μ£Όμ§ λͺ»νλ―λ‘ μλ΅μ΄ κ°λ₯νλ€.
λ°λΌμ ν μ λ ¬μ μκ° λ³΅μ‘λλ O(n * lgn)μ΄λ€.