Pagini recente » Cod sursa (job #1894891) | Cod sursa (job #1754644) | Cod sursa (job #1749080) | Monitorul de evaluare | Cod sursa (job #2016811)
#include <iostream>
#include <fstream>
#define MAX 500001
using namespace std;
int v[MAX];
inline int father(int k)
{
return k / 2;
}
inline int left_son(int k)
{
return k * 2;
}
inline int right_son(int k)
{
return k * 2 + 1;
}
inline void sift(int n, int k)
{
int son;
do
{
son = 0;
if(left_son(k) <= n)
{
son = left_son(k);
if(right_son(k) <= n && v[right_son(k)] > v[son])son = right_son(k);
if(v[son] > v[k])
{
swap(v[son], v[k]);
k = son;
}
else son = 0;
}
}while(son != 0);
}
inline void percolate(int k)
{
while(k > 1 && v[k] > v[father(k)])
{
swap(v[k], v[father(k)]);
k = father(k);
}
swap(v[k], v[father(k)]);
}
inline void build_heap(int n)
{
for(int i = n / 2; i >= 1; i--)sift(n, i);
}
inline void heap_sort(int n)
{
for(int i = n; i >= 2; i--)
{
swap(v[i], v[1]);
sift(i - 1, 1);
}
}
int main()
{
int n, i;
ifstream in;
ofstream out;
in.open("algsort.in");
out.open("algsort.out");
in >> n;
for(i = 1; i <= n; i++)in >> v[i];
build_heap(n);
heap_sort(n);
for(i = 1; i <= n; i++)out << v[i] << " ";
in.close();
out.close();
return 0;
}