Heap Sorting에 관해
2020-04-19
Heap Sorting
최대 힙 트리나 최소 힙 트리를 구성해 정렬을 하는 방법
내림차순 정렬을 위해서는 최대 힙을 구성하고 오름차순 정렬을 위해서는 최소 힙을 구성하면 된다.
Heap Sorting 절차
정렬해야 할 n개의 요소들로 최대 힙(완전 이진 트리 형태)을 만든다.
내림차순또는 오름차순을 기준으로 정렬
그 다음으로 한 번에 하나씩 요소를 힙에서 꺼내서 배열의 뒤부터 저장하면 된다.
삭제되는 요소들(최댓값부터 삭제)은 값이 감소되는 순서로 정렬되게 된다.
장점
시간 복잡도가 좋은편
힙 정렬이 가장 유용한 경우는 전체 자료를 정렬하는 것이 아니라 가장 큰 값 몇개만 필요할 때 이다.
시간복잡도
힙 트리의 전체 높이가 거의 log₂n(완전 이진 트리이므로)이므로
하나의 요소를 힙에 삽입하거나 삭제할 때 힙을 재정비하는 시간이 log₂n만큼 소요된다.
요소의 개수가 n개 이므로 전체적으로 O(nlog₂n)의 시간이 걸린다.
T(n) = O(nlog₂n)
public class HeapSort {
private static void heapSort(int[] arr)// 기능1
{
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--) {
swap(arr, 0, i);
heapify(arr, i, 0);
}
}
private static void heapify(int[] arr, int n, int i)// 기능2
{
int p = i;
int l = i * 2 + 1;
int r = i * 2 + 2;
if (l < n && arr[p] < arr[l]) {
p = l;
}
if (r < n && arr[p] < arr[r]) {
p = r;
}
/* 최대
if (l < n && arr[p] > arr[l]) {
p = l;
}
if (r < n && arr[p] > arr[r]) {
p = r;
}*/
if (i != p) {
swap(arr, p, i);
heapify(arr, n, p);
}
}
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
private static void printArray(int[] arr) {
for (int data : arr) {
System.out.print(data + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = { 3, 9, 4, 7, 5, 0, 1 };
printArray(arr);
heapSort(arr);
printArray(arr);
}
}