Pagini recente » Cod sursa (job #2746108) | Cod sursa (job #2203877) | Cod sursa (job #1355830) | Cod sursa (job #2935790) | Cod sursa (job #1813560)
/** HEAP SORT **/
#include <iostream>
#include <fstream>
#define NMAX 500001
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
typedef int Heap[NMAX];
Heap H;
int n;
void sift(Heap H, int N, int k)
{
int son;
do
{
son = 0;
if (2 * k <= N)
{
son = 2 * k;
if (2 * k + 1 <= N && H[son] > H[2 * k + 1])
son = 2 * k + 1;
if (H[k] <= H[son])
son = 0;
}
if (son)
{
swap(H[k], H[son]);
k = son;
}
}while(son);
}
void percolate(Heap H, int N, int k)
{
int key = H[k];
while (k > 1 && H[k / 2] > key)
{
H[k] = H[k / 2];
k = k / 2;
}
H[k] = key;
}
void cut(Heap H, int &N, int k)
{
swap(H[k], H[N]);
N--;
if (k > 1 && H[k] < H[k / 2])
percolate(H, N, k);
else
sift(H, N, k);
}
void insert(Heap H, int &N, int key)
{
H[++N] = key;
percolate(H, N, N);
}
int main()
{
in >> n;
for (int i = 1; i <= n; i++)
in >> H[i];
in.close();
for (int i = n / 2; i >= 1; i--)
sift(H, n, i);
while (n)
{
out << H[1] << " ";
cut(H, n, 1);
}
out.close();
return 0;
}