Cod sursa(job #2401426)

Utilizator teodorgTeodor G teodorg Data 9 aprilie 2019 18:20:44
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
const int N = 500010;
int n,m,i,x[N];
void heap_down(int);
int main()
{
    f>>n; m=n;
    for(int i=1;i<=n;i++)
        f>>x[i];
    /// sortare prin metoda heap_sort
    /// ( metoda de complexitate optima N log N dar mai lenta decat quicksort )

    /// structuram sirul ca un max-heap

    for(i=n/2;i>=1;i--)
        heap_down(i);

    for(i=n;i>=1;i--)
    {
        /// se aduce elementul cel mai mare disponibil de pe pozitia 1 pe pozitia curenta i
        /// aducand astfel pe pozitia 1 valoarea de pe pozitia i
        /// astfel elementul x[i] devine mai mare decat tot ce are in fata ( exact ce vrem !!! )
        swap(x[i],x[1]);

        /// se "scurteaza" heap-ul cu ultimul elemet care deja sta pe pozitia corecta
        m--;

        /// se repara structura de heap
        heap_down(1);
    }
    for(i=1;i<=n;i++)
        g<<x[i]<<' ';
    return 0;
}
void heap_down(int tata)
{
    int fiu=2*tata;
    if(fiu>m)return;
    if(fiu<m)if(x[fiu+1]>x[fiu])fiu++;
    if(x[fiu]>x[tata]){swap(x[fiu],x[tata]);heap_down(fiu);}
}