ํ ์ ๋ ฌ (Heap Sort)
ํต์ฌ ์์
โข
ํ(Heap) ์๋ฃ๊ตฌ์กฐ ํ์ฉ
โข
์์ ์ด์ง ํธ๋ฆฌ ๊ธฐ๋ฐ
โข
๋ถ์์ ์ ๋ ฌ
โข
์ ์๋ฆฌ ์ ๋ ฌ(in-place sorting)
์๊ฐ ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ | O(nlog n) |
ํ๊ท ์ ๊ฒฝ์ฐ | O(nlog n) |
์ต์
์ ๊ฒฝ์ฐ | O(nlog n) |
๊ณต๊ฐ ๋ณต์ก๋ | O(1) |
์ฃผ์ ํน์ง
โข
ํญ์ O(nlog n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ณด์ฅ
โข
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๊ฑฐ์ ํ์ํ์ง ์์
โข
๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ๋ ฌ์ ํจ์จ์
โข
๋ถ์์ ์ ๋ ฌ์ด๋ฏ๋ก ๋์ผํ ๊ฐ์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์
์์ ์ฝ๋ (Java)
public class HeapSort {
public void sort(int arr[]) {
int n = arr.length;
// ์ต๋ ํ ๊ตฌ์ฑ
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
// ํ์์ ์์๋ฅผ ํ๋์ฉ ์ถ์ถ
for (int i = n-1; i >= 0; i--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapify(arr, i, 0);
}
}
void heapify(int arr[], int n, int i) {
int largest = i;
int left = 2*i + 1;
int right = 2*i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
if (largest != i) {
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
heapify(arr, n, largest);
}
}
}
Java
๋ณต์ฌ
์ง์ ๊ตฌํ
public class MyHeapSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
HeapSort hs = new HeapSort();
hs.sort(arr);
System.out.println("์ ๋ ฌ๋ ๋ฐฐ์ด:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
Java
๋ณต์ฌ
Java Collections์ผ๋ก ๊ตฌํ
import java.util.PriorityQueue;
public class HeapSortWithPQ {
public static void heapSort(int[] arr) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
// ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ํ์ ์ถ๊ฐ
for (int value : arr) {
heap.offer(value);
}
// ํ์์ ์์๋ฅผ ํ๋์ฉ ๊บผ๋ด์ด ๋ฐฐ์ด์ ์ ์ฅ
for (int i = 0; i < arr.length; i++) {
arr[i] = heap.poll();
}
}
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
heapSort(arr);
System.out.println("์ ๋ ฌ๋ ๋ฐฐ์ด:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
Java
๋ณต์ฌ