Cod sursa(job #2704749)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 11 februarie 2021 10:48:55
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
//heapsort
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n,i,v[500002],fiu,tata;
int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=2;i<=n;i++){ //form heap cu i elem, avand deja i-1 fixate
        fiu=i;   // fiuul k are fii 2*k,2*k+1
        tata=i/2;
        while(tata>=1 && v[fiu]>v[tata]){
            swap(v[tata],v[fiu]);
            fiu=tata;
            tata/=2;
        }
    }
    for(i=n;i>1;i--){
        swap(v[1],v[i]); //aduc maximul ultima pozitie nefixata deja
        //corectez heapul stricat de radacina
        tata=1;
        fiu=2;
        while(fiu<i){ //i e deja la locul lui
            if(fiu+1<i && v[fiu+1]>v[fiu]) //exista fiu in dr mai mare
                fiu++;
            if(v[tata]<v[fiu])
                swap(v[tata],v[fiu]);
            else break;
            tata=fiu;
            fiu*=2;
        }
    }
    for(i=1;i<=n;i++)
        fout<<v[i]<<" ";
    return 0;
}