#include <iostream>
#include <vector>
using namespace std;
// Heapify for Min Heap
void heapify(vector<int>& arr, int n, int i)
{
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] < arr[smallest])
smallest = left;
if (right < n && arr[right] < arr[smallest])
smallest = right;
if (smallest != i)
{
swap(arr[i], arr[smallest]);
heapify(arr, n, smallest);
}
}
// Build Min Heap
void buildMinHeap(vector<int>& arr)
{
int n = arr.size();
for (int i = n / 2 - 1; i >= 0; i--)
{
heapify(arr, n, i);
}
}
// Heap Sort using Min Heap (Descending Order)
void heapSort(vector<int>& arr)
{
int n = arr.size();
// Step 1: Build Min Heap
buildMinHeap(arr);
// Step 2: Move smallest to the end repeatedly
for (int i = n - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
heapify(arr, i, 0);
}
}
int main()
{
vector<int> arr = {4, 10, 3, 5, 1};
cout << "Original Array: ";
for (int x : arr)
cout << x << " ";
cout << "\n";
heapSort(arr);
cout << "Sorted Array (Descending): ";
for (int x : arr)
cout << x << " ";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gSGVhcGlmeSBmb3IgTWluIEhlYXAKdm9pZCBoZWFwaWZ5KHZlY3RvcjxpbnQ+JiBhcnIsIGludCBuLCBpbnQgaSkKewogICAgaW50IHNtYWxsZXN0ID0gaTsKICAgIGludCBsZWZ0ID0gMiAqIGkgKyAxOwogICAgaW50IHJpZ2h0ID0gMiAqIGkgKyAyOwoKICAgIGlmIChsZWZ0IDwgbiAmJiBhcnJbbGVmdF0gPCBhcnJbc21hbGxlc3RdKQogICAgICAgIHNtYWxsZXN0ID0gbGVmdDsKCiAgICBpZiAocmlnaHQgPCBuICYmIGFycltyaWdodF0gPCBhcnJbc21hbGxlc3RdKQogICAgICAgIHNtYWxsZXN0ID0gcmlnaHQ7CgogICAgaWYgKHNtYWxsZXN0ICE9IGkpCiAgICB7CiAgICAgICAgc3dhcChhcnJbaV0sIGFycltzbWFsbGVzdF0pOwogICAgICAgIGhlYXBpZnkoYXJyLCBuLCBzbWFsbGVzdCk7CiAgICB9Cn0KCi8vIEJ1aWxkIE1pbiBIZWFwCnZvaWQgYnVpbGRNaW5IZWFwKHZlY3RvcjxpbnQ+JiBhcnIpCnsKICAgIGludCBuID0gYXJyLnNpemUoKTsKCiAgICBmb3IgKGludCBpID0gbiAvIDIgLSAxOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICBoZWFwaWZ5KGFyciwgbiwgaSk7CiAgICB9Cn0KCi8vIEhlYXAgU29ydCB1c2luZyBNaW4gSGVhcCAoRGVzY2VuZGluZyBPcmRlcikKdm9pZCBoZWFwU29ydCh2ZWN0b3I8aW50PiYgYXJyKQp7CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CgogICAgLy8gU3RlcCAxOiBCdWlsZCBNaW4gSGVhcAogICAgYnVpbGRNaW5IZWFwKGFycik7CgogICAgLy8gU3RlcCAyOiBNb3ZlIHNtYWxsZXN0IHRvIHRoZSBlbmQgcmVwZWF0ZWRseQogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID4gMDsgaS0tKQogICAgewogICAgICAgIHN3YXAoYXJyWzBdLCBhcnJbaV0pOwogICAgICAgIGhlYXBpZnkoYXJyLCBpLCAwKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8aW50PiBhcnIgPSB7NCwgMTAsIDMsIDUsIDF9OwoKICAgIGNvdXQgPDwgIk9yaWdpbmFsIEFycmF5OiAiOwogICAgZm9yIChpbnQgeCA6IGFycikKICAgICAgICBjb3V0IDw8IHggPDwgIiAiOwoKICAgIGNvdXQgPDwgIlxuIjsKCiAgICBoZWFwU29ydChhcnIpOwoKICAgIGNvdXQgPDwgIlNvcnRlZCBBcnJheSAoRGVzY2VuZGluZyk6ICI7CiAgICBmb3IgKGludCB4IDogYXJyKQogICAgICAgIGNvdXQgPDwgeCA8PCAiICI7CgogICAgcmV0dXJuIDA7Cn0=