Pagini recente » Cod sursa (job #3002845) | Cod sursa (job #2806202) | Cod sursa (job #36789) | Cod sursa (job #2988885) | Cod sursa (job #2751110)
#include <iostream>
#include <stdio.h>
using namespace std;
const int NMAX = 500000;
int myHeap[NMAX + 1], lastPos;
inline int lSon(int node);
inline int rSon(int node);
inline int father(int node);
inline void sift(int node);
inline void percolate(int node);
inline void cut(int node);
inline void heapify();
int main()
{
FILE *fin = fopen("algsort.in", "r");
fscanf(fin, "%d", &lastPos);
int i;
for (i = 1; i <= lastPos; i++)
fscanf(fin, "%d", &myHeap[i]);
fclose(fin);
heapify();
FILE *fout = fopen("algsort.out", "w");
while (lastPos)
{
fprintf(fout, "%d ", myHeap[1]);
cut(1);
}
fclose(fout);
return 0;
}
inline int lSon(int node) {return node << 1;}
inline int rSon(int node) {return (node << 1) + 1;}
inline int father(int node) {return node >> 1;}
inline void sift(int node)
{
int son;
do
{
son = 0;
if (lSon(node) <= lastPos && myHeap[lSon(node)] < myHeap[node])
son = lSon(node);
if (rSon(node) <= lastPos && myHeap[rSon(node)] < myHeap[lSon(node)] && myHeap[rSon(node)] < myHeap[node])
son = rSon(node);
if (son)
{
swap(myHeap[node], myHeap[son]);
node = son;
}
}while (son);
}
inline void percolate(int node)
{
while (father(node) && myHeap[node] < myHeap[father(node)])
{
swap(myHeap[node], myHeap[father(node)]);
node = father(node);
}
}
inline void cut(int node)
{
swap(myHeap[node], myHeap[lastPos--]);
if (node == 1)
sift(node);
else
{
if (myHeap[node] < myHeap[father(node)])
percolate(node);
else
sift(node);
}
}
inline void heapify()
{
for (int i = (lastPos >> 1); i > 0; i--)
sift(i);
}