힙은 완전이진트리 기반 자료구조이다. 최대힙은 부모 노드의 키 값이 자식 노드의 키 값보다 항상 같거나 큰 이진트리를 뜻한다.
index i에 대해서
힙 정렬이란 최대 힙 트리나 최소 힙 트리를 구성하여 정렬을 하는 방법이다. 내림차순 정렬을 위해서는 최대 힙을 구성하고 오름차순 정렬을 위해서는 최소 힙을 구성한다.
static void heapSort(int[] arr, int n) {
//힙구조로 구성 (Build Max-heap)
heapify(arr, n);
//루트 제거하고 마지막 요소를 루트로 옮김 (Extract-Max)
for(int i=n-1; i>=0; i--) {
swap(arr, 0, i);
heapify(arr, i);
}
}
//Build Max-heap
static void heapify(int[] arr, int last) { //last변수는 가장 마지막 인덱스를 뜻함
for(int i=1; i<last; i++) {
int child = i;
while(child>0) {
int parent = (child - 1)/2;
if(arr[child] > arr[parent]) { //부모와 비교해서 자식이 클경우엔
swap(arr, child, parent); //swap
}
child = parent;
}
}
}
//배열의 요소 두개의 위치를 바꿈
static void swap(int[] arr, int idx1, int idx2) {
int tmp = arr[idx1];
arr[idx1]=arr[idx2]; //idx1 : idx1 -> idx2
arr[idx2]=tmp; //idx2 : idx2 -> idx1
}
https://yozm.wishket.com/magazine/detail/2312/
https://gmlwjd9405.github.io/2018/05/10/algorithm-heap-sort.html
https://yjg-lab.tistory.com/169
https://hongcoding.tistory.com/186
https://good-potato.tistory.com/50
https://jino-dev-diary.tistory.com/entry/Algorithm-%EC%A0%95%EB%A0%AC-Heap-Sort-%ED%9E%99-%EC%A0%95%EB%A0%AC
https://moneylogging.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%9E%99%EC%A0%95%EB%A0%AC
https://velog.io/@eddy_song/heap-sort
https://underdog11.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Heapsort-%ED%9E%99%EC%A0%95%EB%A0%AC
https://velog.io/@emplam27/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%ED%9E%99%EC%A0%95%EB%A0%ACHeap-Sort
https://m.blog.naver.com/adamdoha/222014528828
https://datamoney.tistory.com/240