[μλ£κ΅¬μ‘°] μν₯μ νμ λ ¬ heapsort
μλ νμΈμ μ£ΌμΈμ₯ Hμ λλ€.
μ€λμ νμ λ ¬μ λν΄ μμλ³΄κ² μ΅λλ€.
νμ λ ¬μ ννΈλ¦¬κ΅¬μ‘°λ₯Ό μ΄μ©νμ¬ μ λ ¬μ νλ λ°©λ²μ λλ€.
νμ μ΅μκ°μ΄λ μ΅λκ°μ λΉ λ₯΄κ² μ°Ύμλ΄κΈ° μν΄ μμ μ΄μ§ νΈλ¦¬λ₯Ό κΈ°λ°μΌλ‘ νλ νΈλ¦¬μ λλ€.
μ¬κΈ°μ μμ μ΄μ§νΈλ¦¬λ λΆλͺ¨λ Έλ(root)μ 2κ°μ μμλ Έλ(c)λ₯Ό κ°μ§ ννλ₯Ό λ§ν©λλ€.
νμλ μ΅λνκ³Ό μ΅μν©μ΄ μ‘΄μ¬νκ³ , μ΅λ νμ λΆλͺ¨λ Έλκ° μμλ Έλλ³΄λ€ μ»€μΌν©λλ€.
νμ λ ¬μ νκΈ°μν΄μ μ ν΄μ§ λ°μ΄ν°λ₯Ό νκ΅¬μ‘°λ‘ λ§λ νμ μμν΄μΌ ν©λλ€.
ν μ λ ¬μ μννκΈ° μν΄μ ν μμ± μκ³ λ¦¬μ¦(heapifiy Algorithm)μ μ¬μ©ν©λλ€.
νΉμ λ Έλμ λ μμ μ€ λ ν° μμκ³Ό μμ μ λ°κΎΈλ©΄ λ©λλ€.
μλ₯Ό λ€μ΄
1
4 9
2 3 4 4
9
4 4
2 3 4 1
λ‘ νꡬ쑰λ₯Ό λ§λ€κ³ νΉμ λ Έλ 9μ 1μ μλ‘ λ°κΎΈμ΄ μ€λλ€
1
4 4
2 3 4 9
κ·Έ ν 9λ₯Ό μ μΈν λ€λ₯Έ λ Έλλ€μ λ€μ μ΅λνμ λ§λ€μ΄μ£Όλ κ²μ λ°λ³΅νλ©΄
2
3 2
4 4 4 9
μ ννλ‘ μ λ ¬μ΄ λ κ²μ λλ€.
κ·ΈλΌ μμμλΆν° μ°¨λ‘λλ‘ μΈλ±μ€μ λ£μ΄μ£Όλ©΄ λκ² μ£ .
μ΄λ νμ λ ¬μ μ 체 μκ° λ³΅μ‘λλ
νμμ± μκ³ λ¦¬μ¦μ μκ°λ³΅μ‘λκ° O(log N)μ΄κ³ μ 체 λ°μ΄ν°μ κ°―μκ° Nμ΄λ―λ‘
O(log N * N)μ΄ λκ² μ΅λλ€.
#include <stdio.h>
#define HEAPSIZE 9
int heap[HEAPSIZE] = { 1,5,3,6,2,6,6,4,9 };
//ν ꡬ쑰 λ§λ€κΈ°
int main(void) {
for (int i = 1; i < HEAPSIZE; i++) {
int c = i;
do {
int root = (c - 1) / 2;
if (heap[root] < heap[c]) {
int temp = heap[root];
heap[root] = heap[c];
heap[c] = temp;
} c = root;
} while (c != 0);
}
//ν¬κΈ°λ₯Ό μ€μ¬κ°λ©° ν μ λ ¬
for (int i = HEAPSIZE - 1; i >= 0; i--) {
int temp = heap[0];
heap[0] = heap[i];
heap[i] = temp;
int root = 0;
int c = 1;
//μμ μ€μ ν° κ°μ΄ μλμ§ νμΈ
do {
c = 2 * root + 1;
if (c < i - 1 && heap[c] < heap[c + 1]) {
c++;
}
//root κ°μ΄ λ ν¬λ€λ©΄ κ΅μ²΄
if (c < i && heap[root] < heap[c]) {
temp = heap[c];
heap[c] = heap[root];
heap[root] = temp;
}
root = c;
} while (c < i);
}
for (int i = 0; i < HEAPSIZE; i++) {
printf("%d ", heap[i]);
}
return 0;
}