์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ ํ(Heap) ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ ์ ๋ ฌ ๋ฐฉ์
์์ ์ด์ง ํธ๋ฆฌ๋?
์ฝ์ ํ ๋ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ์ถ๊ฐํ๋ ์ด์ง ํธ๋ฆฌ
ํ ์ํธ๋ ๋ถ์์ ์ ๋ ฌ
์ ์ํจ
์๊ฐ๋ณต์ก๋
ํ๊ท | ์ต์ | ์ต์ |
---|---|---|
ฮ(nlogn) | ฮฉ(nlogn) | O(nlogn) |
- ์ต๋ ํ์ ๊ตฌ์ฑ
- ํ์ฌ ํ ๋ฃจํธ๋ ๊ฐ์ฅ ํฐ ๊ฐ์ด ์กด์ฌํจ. ๋ฃจํธ์ ๊ฐ์ ๋ง์ง๋ง ์์์ ๋ฐ๊พผ ํ, ํ์ ์ฌ์ด์ฆ ํ๋ ์ค์
- ํ์ ์ฌ์ด์ฆ๊ฐ 1๋ณด๋ค ํฌ๋ฉด ์ ๊ณผ์ ๋ฐ๋ณต
๋ฃจํธ๋ฅผ ๋ง์ง๋ง ๋ ธ๋๋ก ๋์ฒด (11 โ 4), ๋ค์ ์ต๋ ํ ๊ตฌ์ฑ
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ต๋ ๊ฐ์ ํ๋์ฉ ๋ฝ์๋ด๋ฉด์ ์ ๋ ฌํ๋ ๊ฒ์ด ํ ์ํธ
public void heapSort(int[] array) {
int n = array.length;
// max heap ์ด๊ธฐํ
for (int i = n/2-1; i>=0; i--){
heapify(array, n, i); // 1
}
// extract ์ฐ์ฐ
for (int i = n-1; i>0; i--) {
swap(array, 0, i);
heapify(array, i, 0); // 2
}
}
์ผ๋ฐ ๋ฐฐ์ด์ ํ์ผ๋ก ๊ตฌ์ฑํ๋ ์ญํ
์์๋ ธ๋๋ก๋ถํฐ ๋ถ๋ชจ๋ ธ๋ ๋น๊ต
n/2-1๋ถํฐ 0๊น์ง ์ธ๋ฑ์ค๊ฐ ๋๋ ์ด์ ๋?
๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์์๋ ธ๋ (i2 + 1), ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋(i2 + 2)์ด๊ธฐ ๋๋ฌธ
์์๊ฐ ํ๋ ์ ๊ฑฐ๋ ์ดํ์ ๋ค์ ์ต๋ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํจ
๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์งํ(extract ์ฐ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด)
public 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);
}
}
๋ค์ ์ต๋ ํ์ ๊ตฌ์ฑํ ๋๊น์ง ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๋ฅผ swapํ๋ฉฐ ์ฌ๊ท ์งํ
ํต์ ๋ ฌ๊ณผ ํฉ๋ณ์ ๋ ฌ์ ์ฑ๋ฅ์ด ์ข๊ธฐ ๋๋ฌธ์ ํ ์ ๋ ฌ์ ์ฌ์ฉ๋น๋๊ฐ ๋์ง๋ ์์.
ํ์ง๋ง ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ง์ด ํ์ฉ๋๊ณ ์์ผ๋ฉฐ, ์ด๋ ํจ๊ป ๋ฐ๋ผ์ค๋ ๊ฐ๋
์ด ํ ์ํธ
-
๊ฐ์ฅ ํฌ๊ฑฐ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ตฌํ ๋
์ต์ ํ or ์ต๋ ํ์ ๋ฃจํธ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ํ ๊ตฌ์ฑ์ ํตํด ๊ตฌํ๋ ๊ฒ์ด ๊ฐ๋ฅ
-
์ต๋ k ๋งํผ ๋จ์ด์ง ์์๋ค์ ์ ๋ ฌํ ๋
์ฝ์ ์ ๋ ฌ๋ณด๋ค ๋์ฑ ๊ฐ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์์
private void solve() {
int[] array = { 230, 10, 60, 550, 40, 220, 20 };
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;
// init, max heap
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(array, n, i);
}
// for extract max element from heap
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;
}