Cod sursa(job #1708391)

Utilizator ANA-MARIA.TIGAUTigau Ana-Maria ANA-MARIA.TIGAU Data 26 mai 2016 23:28:22
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.64 kb
#include<iostream>
#include<fstream>
#include<vector>

using namespace::std;
ofstream fout("algsort.out");
int N;

template<class T>
class Coada
{
private:
    vector<T> co;
    void shiftDown(int x, int y);
    void shiftUp(int x, int y);
    void creare_heap();
public:
Coada();
Coada(vector<T> &);
void push(T );
void afis();
void Heapsort();
void pop();
};

template<class T>Coada<T>::Coada(){ }

template<class T>Coada<T>::Coada(vector <T> &v)
{
    if (v.size() > 0)
    {
        co = v;
        creare_heap();
    }
}

template < class T > void Coada<T>::push(T val)
{
    co.push_back(val);
    shiftUp(0, co.size() - 1);
}

template<class T> void Coada<T>::shiftUp(int prim, int ultim)
{
    int parent;
    int child = ultim;
    while (child > prim)
    {
        parent = (child - 1) / 2;
        if (co[child] > co[parent])
        {
            T aux;
            aux = co[child];
            co[child] = co[parent];
            co[parent] = aux;

            child = parent;
        }
        else
            break;
    }

}

template<class T> void Coada<T>::shiftDown(int prim, int ultim)
{
    int root = prim;
    while ((root * 2 / 1) + 1 <= ultim)
    {
        int left = (root * 2) + 1;
        int right = left + 1;
        int aux = root;
        if (co[aux] < co[left])
            aux = left;
        if ((right <= ultim) && (co[aux] < co[right]))
            aux = right;
        if (aux != root)
        {
            T aux1 = co[root];
            co[root] = co[aux];
            co[aux] = aux1;

            root = aux;
        }
        else
            break;
    }
}

template<class T> void Coada<T>::creare_heap()
{
    int i;
    int sizee = co.size();
    for (i = (sizee - 1) / 2; i >= 0; --i)
        shiftDown(i, sizee - 1);
}


template<class T> void Coada<T>::Heapsort()
{
    int i;
    T temp;
    for (i = co.size() - 1; i >= 1; i--)
    {
        temp = co[0];
        co[0] = co[i];
        co[i] = temp;
        shiftDown(0, i - 1);
    }
}


template<class T>void Coada<T>::afis()
{
    int i;
    int size1 = co.size();
    if (size1 < 1)
    {
        cout << "coada este vida" << endl;
        return;
    }
    for (i = 0; i < size1; i++)
        fout <<co[i]<<" ";

}
/*template<class T>void Coada<T>::pop()
{ int i;
int size1=co.size();
 fout<<co[0];
 for(i=1;i<size1;i++)
   co[i-1]=co[i];
}*/
int main(){
    ifstream fin("algsort.in");
    int x;
    Coada<int> C;
    fin>> N;
    while (fin >> x)
        C.push(x);
    C.Heapsort();
     C.afis();
     /*fout<<'\n';
     C.pop();*/
    return 0;
}