#include <iostream>
#include <vector>
using namespace std;
// 힙을 유지하기 위한 heapify 함수
void heapify(vector<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) {
swap(arr[i], arr[largest]);
// 재귀적으로 힙 구조 유지
heapify(arr, n, largest);
}
}
// 주어진 배열로부터 힙 생성
void buildHeap(vector<int>& arr, int n) {
// 마지막 부모 노드부터 heapify 진행
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
}
// 힙 정렬 수행
void heapSort(vector<int>& arr, int n) {
// 최대 힙 생성
buildHeap(arr, n);
// 힙에서 하나씩 꺼내 정렬
for (int i = n - 1; i > 0; i--) {
// 현재 루트(최대값)를 끝으로 이동
swap(arr[0], arr[i]);
// 줄어든 힙에 대해 heapify
heapify(arr, i, 0);
}
}
int main() {
vector<int> arr = {5, 10, 264, 362, 865, 63, 94, 475, 135, 932,
25, 9, 33, 287, 332, 745, 377, 820, 62, 1};
int n = arr.size();
// 1. 힙 생성
vector<int> heapArr = arr; // 복사
buildHeap(heapArr, n);
cout << "1. 생성된 힙 배열: [";
for (int i = 0; i < n; i++) {
cout << heapArr[i];
if (i != n - 1) cout << ", ";
}
cout << "]\n";
// 2. 힙 정렬
heapSort(arr, n);
cout << "2. 정렬된 배열: [";
for (int i = 0; i < n; i++) {
cout << arr[i];
if (i != n - 1) cout << ", ";
}
cout << "]\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8g7Z6Z7J2EIOycoOyngO2VmOq4sCDsnITtlZwgaGVhcGlmeSDtlajsiJgKdm9pZCBoZWFwaWZ5KHZlY3RvcjxpbnQ+JiBhcnIsIGludCBuLCBpbnQgaSkgewogICAgaW50IGxhcmdlc3QgPSBpOyAgICAgICAgIC8vIOujqO2KuOulvCDqsIDsnqUg7YGwIOqwkuycvOuhnCDqsIDsoJUKICAgIGludCBsZWZ0ID0gMiAqIGkgKyAxOyAgICAvLyDsmbzsqr0g7J6Q7IudCiAgICBpbnQgcmlnaHQgPSAyICogaSArIDI7ICAgLy8g7Jik66W47Kq9IOyekOyLnQoKICAgIC8vIOyZvOyqvSDsnpDsi53snbQg66Oo7Yq467O064ukIO2BrOuLpOuptAogICAgaWYgKGxlZnQgPCBuICYmIGFycltsZWZ0XSA+IGFycltsYXJnZXN0XSkKICAgICAgICBsYXJnZXN0ID0gbGVmdDsKCiAgICAvLyDsmKTrpbjsqr0g7J6Q7Iud7J20IO2YhOyerCDqsIDsnqUg7YGwIOqwkuuztOuLpCDtgazri6TrqbQKICAgIGlmIChyaWdodCA8IG4gJiYgYXJyW3JpZ2h0XSA+IGFycltsYXJnZXN0XSkKICAgICAgICBsYXJnZXN0ID0gcmlnaHQ7CgogICAgLy8g6rCA7J6lIO2BsCDqsJLsnbQg66Oo7Yq46rCAIOyVhOuLiOuptCDqtZDtmZgKICAgIGlmIChsYXJnZXN0ICE9IGkpIHsKICAgICAgICBzd2FwKGFycltpXSwgYXJyW2xhcmdlc3RdKTsKICAgICAgICAvLyDsnqzqt4DsoIHsnLzroZwg7Z6ZIOq1rOyhsCDsnKDsp4AKICAgICAgICBoZWFwaWZ5KGFyciwgbiwgbGFyZ2VzdCk7CiAgICB9Cn0KCi8vIOyjvOyWtOynhCDrsLDsl7TroZzrtoDthLAg7Z6ZIOyDneyEsQp2b2lkIGJ1aWxkSGVhcCh2ZWN0b3I8aW50PiYgYXJyLCBpbnQgbikgewogICAgLy8g66eI7KeA66eJIOu2gOuqqCDrhbjrk5zrtoDthLAgaGVhcGlmeSDsp4TtlokKICAgIGZvciAoaW50IGkgPSBuIC8gMiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaGVhcGlmeShhcnIsIG4sIGkpOwogICAgfQp9CgovLyDtnpkg7KCV66CsIOyImO2WiQp2b2lkIGhlYXBTb3J0KHZlY3RvcjxpbnQ+JiBhcnIsIGludCBuKSB7CiAgICAvLyDstZzrjIAg7Z6ZIOyDneyEsQogICAgYnVpbGRIZWFwKGFyciwgbik7CgogICAgLy8g7Z6Z7JeQ7IScIO2VmOuCmOyUqSDqurzrgrQg7KCV66CsCiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICAvLyDtmITsnqwg66Oo7Yq4KOy1nOuMgOqwkinrpbwg64Gd7Jy866GcIOydtOuPmQogICAgICAgIHN3YXAoYXJyWzBdLCBhcnJbaV0pOwogICAgICAgIC8vIOykhOyWtOuToCDtnpnsl5Ag64yA7ZW0IGhlYXBpZnkKICAgICAgICBoZWFwaWZ5KGFyciwgaSwgMCk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYXJyID0gezUsIDEwLCAyNjQsIDM2MiwgODY1LCA2MywgOTQsIDQ3NSwgMTM1LCA5MzIsCiAgICAgICAgICAgICAgICAgICAgICAgMjUsIDksIDMzLCAyODcsIDMzMiwgNzQ1LCAzNzcsIDgyMCwgNjIsIDF9OwoKICAgIGludCBuID0gYXJyLnNpemUoKTsKCiAgICAvLyAxLiDtnpkg7IOd7ISxCiAgICB2ZWN0b3I8aW50PiBoZWFwQXJyID0gYXJyOyAgLy8g67O17IKsCiAgICBidWlsZEhlYXAoaGVhcEFyciwgbik7CgogICAgY291dCA8PCAiMS4g7IOd7ISx65CcIO2emSDrsLDsl7Q6IFsiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBjb3V0IDw8IGhlYXBBcnJbaV07CiAgICAgICAgaWYgKGkgIT0gbiAtIDEpIGNvdXQgPDwgIiwgIjsKICAgIH0KICAgIGNvdXQgPDwgIl1cbiI7CgogICAgLy8gMi4g7Z6ZIOygleugrAogICAgaGVhcFNvcnQoYXJyLCBuKTsKCiAgICBjb3V0IDw8ICIyLiDsoJXroKzrkJwg67Cw7Je0OiBbIjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY291dCA8PCBhcnJbaV07CiAgICAgICAgaWYgKGkgIT0gbiAtIDEpIGNvdXQgPDwgIiwgIjsKICAgIH0KICAgIGNvdXQgPDwgIl1cbiI7CgogICAgcmV0dXJuIDA7Cn0K
1. 생성된 힙 배열: [932, 865, 332, 820, 25, 63, 287, 745, 362, 10, 5, 9, 33, 264, 94, 475, 377, 135, 62, 1]
2. 정렬된 배열: [1, 5, 9, 10, 25, 33, 62, 63, 94, 135, 264, 287, 332, 362, 377, 475, 745, 820, 865, 932]