카테고리 없음
Heap sort 구현해 보기
건이두
2019. 12. 11. 18:07
728x90
잠시 쉬는 시간에, 알고리즘 도감 앱을 잠깐 보다가, heap sort가 눈에 띄여서, 오늘은 heap sort을 코딩해 보았습니다.
package com.tistory.skysign.Heap_sort;
// heap sort의 코드가 필요하신분은 아래 링크 참고하세요.
// https://www.geeksforgeeks.org/java-program-for-heap-sort/
// 이 소스 파일도, 위의 링크 참고해서 만들었습니다.
// heap sort 알고리즘을 보다이해 하실 분은 https://www.youtube.com/watch?v=2DmK_H7IdTo
//
public class HeapSort {
public void heapSort(int d[]) {
// build max heap
// 즉, binary tree로 child가 항상 parent 보다 작은 상태를 만들겠습니다.
// N : 트리에 있는 노드의 숫자
int N = d.length;
// N>>1 해서 N을 2로 나누고 -1 한 인덱스 부터, root node은 0까지 heapify 합니다.
// N/2-1 ~ 0 까지 루프를 한다는 것은, 바이너리 트리에서 sibling 을 제외 하고,
// 나머지 노드 들에 대해서, 모두 방문해서 heapify 한다는 것입니다.
// heapify는 child가 parent보다 작은 상태가 되도록, child와 parent를 swap하는 일을 말합니다.
for(int i= (N>>1) -1; i>=0; --i) {
heapify(d, N, i);
}
// N/2-1 ~ 0 까지 heapify가 끝나면, index 0 에 가장 큰 값이 위치 하게 됩니다.
for(int i=N-1; i>=0; --i) {
int t = d[0];
d[0] = d[i];
d[i] = t;
// 가장 큰 값을 찾았으니, 이제 tree의 크기를 1 줄여서
// 그 다음 큰 값을 찾기위해서, heapify 할 차례입니다.
heapify(d, i, 0);
}
}
private void heapify(int[] d, int N, int idxParent) {
// 가장 큰 값을 가지고 있는 인덱스가 i 라고 가정하고,
// 이후에 idxBiggest가 i 값과 다르면, 아래의 2가지 스텝을 실행 합니다.
int idxBiggest = idxParent;
int idxLeftChild = (idxParent<<1) +1;
int idxRightChild = (idxParent<<1) +2;
// binary tree이지만, full binary tree가 아닐 수 있기 때문에,
// idxLeftChild와 idxRightChild모두 N 보다 작을 때만, 비교 해야 합니다.
if((idxLeftChild < N) && d[idxLeftChild] > d[idxBiggest])
idxBiggest = idxLeftChild;
if((idxRightChild < N) && d[idxRightChild] > d[idxBiggest])
idxBiggest = idxRightChild;
if(idxBiggest != idxParent) {
// idxBiggest와 idxParent 값을 swap 합니다.
int t = d[idxParent];
d[idxParent] = d[idxBiggest];
d[idxBiggest] = t;
// idxBiggest에 idxParent값이 들어 왔으므로,
// idxBiggest에 대해서, heapify합니다.
heapify(d, N, idxBiggest);
}
}
public static void main(String[] args) {
HeapSort hs = new HeapSort();
int d[] = new int[]{1, 3, 5, 7, 4};
hs.heapSort(d);
for(int n: d)
System.out.printf("%d ", n);
}
}
728x90