Cod sursa(job #2073864)

Utilizator gundorfMoldovan George gundorf Data 23 noiembrie 2017 19:40:44
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#define Nmax 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");

int n,v[Nmax];
void Citire ()
{
    int i;
    fin>>n;
    for (i=1; i<=n; i++)
        fin>>v[i];

}
void Percolate (int v[],int poz,int n)
{
    if (v[poz/2]<v[poz]&&poz/2>0)
    {
        swap(v[poz/2],v[poz]);
        Percolate(v,poz/2,n);
    }
}


void Max_Heapify (int v[],int poz,int n)
{
    if  (v[poz*2]>v[poz]||v[poz*2+1]>v[poz])//daca are vreun fiu mai mare ca el
    {
        if (v[poz*2]>v[poz*2+1]&&2*poz<=n) //il iau pe cel mai mare si fac swap intre ei si continui ca sa vad daca a ajuns pe pozitia corecta
        {
            swap(v[poz],v[poz*2]);
            if (poz*2 <= n/2) Max_Heapify(v,poz*2,n);
        }
        else
        {
            if (poz*2+1<=n)
                swap(v[poz],v[poz*2+1]);
            if (poz*2+1 <= n/2) Max_Heapify(v,poz*2+1,n);
        }
    }
}
void Creare_Heap ()
{
    int i;
    for (i=n/2; i>0; i--)
        Max_Heapify(v,i,n);
}

void Dezradacinare (int v[],int &n)
{
    int i;
    swap(v[1],v[n]);
    n--;
    if (n>0)
        Max_Heapify(v,1,n);
}

void HeapSort(int v[],int n)
{
    int copie=n,i;

    while (n>0)
    {
        if (n==2)
        {
            if (v[1]>v[2])
            {
                swap(v[1],v[2]);
                break;
            }
            else break;
        }
        else Dezradacinare(v,n);

    }
    for (i=1; i<=copie; i++)
        fout<<v[i]<<" ";
}




int main()
{
    int i;
    Citire();
    Creare_Heap();
    /*for (i=1;i<=n;i++)
        fout<<v[i]<<" ";
    */
    HeapSort(v,n);
    return 0;
}