Pagini recente » Cod sursa (job #2246551) | Cod sursa (job #2728679) | Cod sursa (job #311811) | Cod sursa (job #1424038) | Cod sursa (job #2664019)
#include <iostream>
#include <fstream>
#define NMAX 200001
std::ifstream f("algsort.in");
std::ofstream g("algsort.out");
int v[NMAX], n;
void upheap(int node)
{
while (node > 0 && v[node] > v[(node-1)/2])
{
std::swap(v[node], v[(node - 1) / 2]);
node = (node - 1) / 2;
}
}
int getIdxMax(int node, int size)
{
if (node * 2 + 2 < size)
return v[node * 2 + 1] >= v[node * 2 + 2] ? node * 2 + 1 : node * 2 + 2;
return node * 2 + 1;
}
void downheap(int node, int size)
{
while (node < size / 2)
{
int idxMax = getIdxMax(node, size);
if (v[node] < v[idxMax])
{
std::swap(v[node], v[idxMax]);
node = idxMax;
}
else return;
}
}
void heapify()
{
for (int i = n/2-1;i>=0;--i)
downheap(i,n);
}
void heapsort()
{
heapify();
for (int i = n-1; i > 0; --i)
{
std::swap(v[0], v[i]);
downheap(0, i);
}
}
void citire()
{
f >> n;
for (int i = 0; i < n; ++i)
f >> v[i];
}
int main() {
citire();
heapsort();
for (int i = 0; i < n; ++i)
g << v[i] << ' ';
}