written by sohyeon, hyemin ๐ก
ํ(Heap)
์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ค ์ค์์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๋๋ก ๋ง๋ค์ด์ง ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
์ฆ. ํ(Heap)
์ ๋ถ๋ชจ ๋
ธ๋์ ํค ๊ฐ์ด ์์ ๋
ธ๋์ ํค ๊ฐ๋ณด๋ค ํญ์ ํฐ(์์) ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
9 => 7 => 6 => 5 => 4 => 3 => 2 => 2 => 1=> 3
์ ๊ฐ์ด ์ธ๋ฑ์ค์ ๊ฐ์ 1์ฉ ๋๋ฆฌ๋ฉด์ ๋ฐฐ์ด์ ๊ฐ ์์์ ํ์ ์์๋ฅผ ๋์
ํ๋ค.
1. ๋ถ๋ชจ๋ a[(i-1)/2]
2. ์ผ์ชฝ ์์์ a[i*2+1]
3. ์ค๋ฅธ์ชฝ ์์์ a[i*2+2]
ํ ์ ๋ ฌ(Heap Sort)
์ ๊ฐ์ฅ ํฐ(์์) ๊ฐ์ด ๋ฃจํธ์ ์์น
ํ๋ ํน์ง์ ์ด์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํ ์ ๋ ฌ์ ์ ํ ์ ๋ ฌ์ ์์ฉ
ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ ํ์์ ๊ฐ์ฅ ํฐ(์์) ๊ฐ์ธ ๋ฃจํธ๋ฅผ ๊บผ๋ด๊ณ ๋จ์ ์์์์ ๋ค์ ๊ฐ์ฅ ํฐ(์์) ๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๋ฃจํธ๋ฅผ ๊บผ๋ด๊ณ ๋จ์ ์์๋ก ๋ง๋ ํธ๋ฆฌ๋ ํ์ ํํ๋ฅผ ์ ์งํ ์ ์๋๋ก ์ฌ๊ตฌ์ฑํด์ผ ํ๋ค.
1. ๋ฃจํธ๋ฅผ ๊บผ๋ธ๋ค.
2. ๋ง์ง๋ง ์์๋ฅผ ๋ฃจํธ๋ก ์ด๋ํ๋ค.
3. ์๊ธฐ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง๋ ์์ ์์์ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ฉฐ ์๋์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ๋ ์์
์ ๋ฐ๋ณตํ๋ค. ์ด๋ ์์์ ๊ฐ์ด ์๊ฑฐ๋ ์์ ๋ค๋ค๋ฅด๋ฉด ์์
์ด ์ข
๋ฃ๋๋ค.
1. ํ์ ๋ฃจํธ(a[0])์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊บผ๋ด ๋ฐฐ์ด ๋ง์ง๋ง ์์(a[9])์ ๋ฐ๊พผ๋ค.
2. ๊ฐ์ฅ ํฐ ๊ฐ์ a[9]๋ก ์ฎ๊ธฐ๋ฉด a[9]๋ ์ ๋ ฌ์ ๋ง์น๊ฒ ๋๋ค. ์์์ ์ดํด๋ณธ ์์๋๋ก a[0]~a[8]์ ์์๋ฅผ ํ์ผ๋ก ๋ง๋ ๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ ๋ฒ์งธ๋ก ํฐ ์์์ธ 9๊ฐ ๋ฃจํธ์ ์์นํ๊ฒ ๋๋ค. ํ์ ๋ฃจํธ a[0]์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ธ 9๋ฅผ ๊บผ๋ด ์์ง ์ ๋ ฌํ์ง ์์ ๋ถ๋ถ์ ๋ง์ง๋ง ์์์ธ a[8]๊ณผ ๋ฐ๊พผ๋ค.
3. ๋ ๋ฒ์งธ๋ก ํฐ ๊ฐ์ a[8]๋ก ์ฎ๊ธฐ๋ฉด a[8]~a[9]๋ ์ ๋ ฌ์ ๋ง์น๊ฒ ๋๋ค. ๊ทธ๋ฐ ๋ค์ a[0]~a[7]์ ์์๋ฅผ ํ์ผ๋ก ๋ง๋ ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ธ ๋ฒ์งธ๋ก ํฐ ์์์ธ 8์ด ๋ฃจํธ์ ์์นํ๊ฒ ๋๋ค. ํ์ ๋ฃจํธ a[0]์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ธ 8์ ๊บผ๋ด ์์ง ์ ๋ ฌํ์ง ์์ ๋ถ๋ถ์ ๋ง์ง๋ง ์์์ธ a[7]๊ณผ ๋ฐ๊พผ๋ค.
- ์ด ๊ณผ์ ์ ์ ์ฉํ๊ธฐ ์ ์ ๋ฐฐ์ด์ ํ ์ํ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๋ํ, ์ ๋ ฌ์ ๋ง์น๊ฒ ๋๋ค๋ฉด, ์ ๋ ฌํ์ง ์์ ๋ถ๋ถ์ ์์๋ฅผ ํ์ผ๋ก ๋ง๋ค์ด์ผํ๋ค.
- ์๊ฐ ๋ณต์ก๋๊ฐ ์ข์ ํธ์ด๋ค.
- ํ ์ ๋ ฌ์ด ์ ์ฉํ ๋๋ ์ ์ฒด ์๋ฃ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์๋๋ผ
๊ฐ์ฅ ํฐ(์์) ๊ฐ ์ผ๋ถ๋ง ํ์ํ ๋
์ด๋ค.
- ํ ํธ๋ฆฌ์ ์ ์ฒด ๋์ด๊ฐ ๊ฑฐ์
log2(n)
(์์ ์ด์งํธ๋ฆฌ)์ด๋ฏ๋ก ํ๋์ ์์๋ฅผ ํ์ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ๋ ํ์ ์ฌ์ ๋นํ๋ ์๊ฐlog2(n)
๋งํผ ์์๋๋ค. - ์์์ ๊ฐ์๊ฐ n๊ฐ์ด๋ฏ๋ก ์ ์ฒด์ ์ผ๋ก
O(nlog2(n))
์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
T(n) = O(nlog2(n))
import java.util.Scanner;
// ํ ์ ๋ ฌ
class HeapSort {
// ๋ฐฐ์ด ์์ a[id1]๊ณผ a[id2]์ ๊ฐ์ ๋ฐ๊พผ๋ค.
static void swap(int[] a, int id1, int id2) {
int t = a[id1];
a[id1] = a[id2];
a[id2] = t;
}
// a[left] ~ a[right]๋ฅผ ํ์ผ๋ก ๋ง๋ ๋ค.
static void downHeap(int[] a, int left, int right) {
int temp = a[left]; // ๋ฃจํธ
int child; // ํฐ ๊ฐ์ ๊ฐ์ง ๋
ธ๋
int parent; // ๋
ธ๋
for(parent = left; parent < (right+1)/2; parent = child) {
int cl = parent * 2 + 1; // ์ผ์ชฝ ์์
int cr = cl + 1; // ์ค๋ฅธ์ชฝ ์์
child = (cr <= right && a[cr] > a[cl]) ? cr : cl; // ํฐ ๊ฐ์ ๊ฐ์ง ๋
ธ๋๋ฅผ ์์์ ๋์
if(temp >= a[child])
break;
a[parent] = a[child];
}
a[parent] = temp;
}
// ํ ์ ๋ ฌ
static void heapSort(int[] a, int n) {
for(int i = (n-1)/2; i>=0; i--) // a[i]~a[n-1]๋ฅผ ํ์ผ๋ก ๋ง๋ค๊ธฐ
downHeap(a, i, n-1);
for(int i = n-1; i>0; i--) {
swap(a,0,i); // ๊ฐ์ฅ ํฐ ์์์ ์์ง ์ ๋ ฌ๋์ง ์์ ๋ถ๋ถ์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ค.
downHeap(a, 0, i-1); // a[0]~a[i-1]์ ํ์ผ๋ก ๋ง๋ ๋ค.
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("ํ ์ ๋ ฌ");
System.out.println("์์์ : ");
int n = scan.nextInt();
int[] x = new int[n];
for(int i = 0; i<n; i++) {
System.out.print("x["+i+"] : ");
x[i] = scan.nextInt();
}
heapSort(x, n); // ๋ฐฐ์ด x๋ฅผ ํ ์ ๋ ฌํ๋ค.
System.out.println("์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ต๋๋ค.");
for(int i = 0; i<n; i++)
System.out.println("x["+i+"] = "+x[i]);
}
}
๋ฐฐ์ด a ๊ฐ์ด๋ฐ a[left]~a[right]์ ์์๋ฅผ ํ์ผ๋ก ๋ง๋๋ ๋ฉ์๋์ด๋ค. a[left] ์ด์ธ์๋ ๋ชจ๋ ํ ์ํ๋ผ๊ณ ๊ฐ์ ํ๊ณ a[left]๋ฅผ ์๋ซ๋ถ๋ถ์ ์๋ง์ ์์น๋ก ์ฎ๊ฒจ ํ ์ํ๋ฅผ ๋ง๋ ๋ค.
์์์ ๊ฐ์๊ฐ n๊ฐ์ธ ๋ฐฐ์ด a๋ฅผ ํ ์ ๋ ฌํ๋ ๋ฉ์๋์ด๋ค.
1. downHeap ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด a๋ฅผ ํ์ผ๋ก ๋ง๋ ๋ค.
2. ๋ฃจํธ์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋นผ๋ด์ด ๋ฐฐ์ด ๋ง์ง๋ง ์์์ ๋ฐ๊พธ๊ณ ๋ฐฐ์ด์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ค์ ํ์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌ์ ์ํํ๋ค.
-
Do it! ์๋ฃ๊ตฌ์กฐ์ ํจ๊ป ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋ฌธ ์๋ฐํธ
-
C์ธ์ด๋ก ์ฝ๊ฒ ํ์ด์ด ์๋ฃ ๊ตฌ์กฐ