Cod sursa(job #1786648)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 23 octombrie 2016 14:01:38
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
//SortareBatog
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

#define NMAX 500000
#define MAX (((1<<30) - 1) + (1<<30))
#define MIN -1

unsigned N;
int v[NMAX+5], aux[NMAX+5], maxim;
unsigned i, j, pozMax;

void SortareBatog() {
    unsigned rad = 1, step;

    while(rad*rad < N) rad++; //caut sqrt(n)

    int maximi[rad+1];

    for(i = 1; i < rad ; i++) { //caut maximul din secventele 1...sqrt(n), sqrt(n)+1...2*sqrt(n), ...
        step = (i-1)*rad;
        maxim = 0;
        for(j = 1 ; j <= rad ; j++) {
            if(v[j+step] > maxim)
                maxim = v[j+step];
        }
        maximi[i] = maxim;
    }

    maxim = 0;
    for(i = (rad-1)*rad + 1 ; i <= N ; i++) //caut maximul din ultima secventa ( a carei lungime apartine intervalului [1, sqrt(n)] )
        if(maxim < v[i])
            maxim = v[i];

    maximi[rad] = maxim;
    for(i = N ; i >= 1 ; i--) {
        maxim = maximi[1];
        pozMax = 1;
        for(j = 2 ; j <= rad ; j++)
            if(maxim < maximi[j]) {
                maxim = maximi[j];
                pozMax = j;
            }
        //introduc valoarea in vectorul aux
        aux[i] = maxim;
        //recalculez maximul
        if(pozMax == rad) { //caz particular
            for(j = (rad-1)*rad + 1; j <= N ; j++) //stergem maximul
                if(v[j] == maxim) {
                    v[j] = MIN;
                    j = N;
                }
            maxim = -1;
            for(j = (rad-1)*rad + 1; j <= N ; j++) //recalculam maximul pe subsecventa
                if(v[j] > maxim)
                    maxim = v[j];
        }
        else { //caz simplu
            step = (pozMax-1)*rad;
            for(j = 1 ; j <= rad ; j++) //stergem maximul
                if(v[j+step] == maxim) {
                    v[j+step] = MIN;
                    j = rad;
                }
            maxim = -1;
            for(j = 1 ; j <= rad ; j++) //recalculam maximul pe subsecventa
                if(v[j+step] > maxim)
                    maxim = v[j+step];
            //actualizez maximi[pozMax]
        }

        maximi[pozMax] = maxim;
    }
    for(i = 1 ; i <= N ; i++)
        v[i] = aux[i];

    for(i=1 ; i<=N ; i++)
        cout<<v[i]<<' ';
}

int main()
{
    fin>>N;
    for(i = 1 ; i <= N ; i++)
        fin>>v[i];

    SortareBatog();

    for(i = 1 ; i <= N ; i++)
        fout<<v[i]<<' ';

    fin.close();
    fout.close();

    return 0;
}