Cod sursa(job #1298592)

Utilizator deea101Andreea deea101 Data 22 decembrie 2014 22:55:41
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");

const int NMAX=500001;

class Heap
{
    private:
        int size, h[NMAX], ph[NMAX],val[NMAX];
        
        void percolate(int nod)
        {
            while(nod/2 && val[h[nod/2]]>val[h[nod]])
            {
                swap(h[nod],h[nod/2]);
                ph[h[nod]]=nod;
                ph[h[nod/2]]=nod/2;
				
				nod=nod/2;
            }
        }

        void sift(int nod)
		{
			int f1,f2,son=nod;
			do
			{
				f1=2*nod;
				f2=2*nod+1;

				if(f2<=size && val[h[f2]]<val[h[son]]) son=f2;
				if(f1<=size && val[h[f1]]<val[h[son]]) son=f1;

				swap(h[son],h[nod]);
				ph[h[son]]=son;
				ph[h[nod]]=nod;

				nod=son;
			}while(nod!=son);    
		}
		
    public:
        Heap()
        {
            size=0;
            memset(h,0,sizeof(h));
            memset(ph,0,sizeof(ph));
        }
		
		int heapSize()
		{
			return size;
		}
		
        void addHeap(int x)
        {
            
            val[++size]=x;
            h[size]=size;
            ph[size]=size;
            percolate(size);
        }

        int pop_front()
        {
            int aux=h[1];
            h[1]=h[size];
            ph[h[1]]=1;
            sift(1);
			size--;
            return val[aux];
        }
}heap;

int main()
{
	int N;
	f>>N;
	int i,x;
	for(i=1;i<=N;i++)
	{
		f>>x;
		heap.addHeap(x);
	}
	
	while(heap.heapSize()>0)
	{
		x=heap.pop_front();
		g<<x<<' ';
	}
}