Cod sursa(job #1785589)

Utilizator teo.cons98Constantin Teodor-Claudiu teo.cons98 Data 21 octombrie 2016 17:20:47
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int v[500001], A[10000], n, q, nr, l, v1[500001], x = 0;

void citire()
{
    fin>>n;
    for(int i = 0; i < n; ++i)
    {
        fin>>v[i];
    }
}

void sirul()
{
    int pozmin1, minim = 0x7fffffff;
    for(int i = 0; i < n; ++i)
    {
        q = i / nr;
        if(i % nr == 0 and q > 0)
        {
            v[pozmin1] = 0x7fffffff;
            A[q - 1] = minim;
            minim = 0x7fffffff;

        }
        if(v[i] < minim)
        {
            minim = v[i];
            pozmin1 = i;
        }
    }
     A[q] = minim;
     v[pozmin1] = 0x7fffffff;
}

void sir(int poz)
{
    int minim = 0x7fffffff, k = (poz + 1)*nr, pozmin1;
    if(k > n) k = n;

    for(int i = poz * nr; i < k; ++i)
    {
        if(v[i] < minim)
        {
            minim = v[i];
            pozmin1 = i;
        }
    }
    A[poz] = minim;
    v[pozmin1] = 0x7fffffff;
}

int minimsm()
{
    int min1 = 0x7fffffff, pozmin1;
    for(int i = 0; i < l; ++i)
    {
        if(A[i] < min1)
        {
            min1 = A[i];
            pozmin1 = i;
        }
    }
    //cout<<min1<<" ";
    sir(pozmin1);
    return min1;
}

int main()
{
    citire();
    l = sqrt(n);
    nr = l;
    if(n  != l * l)
    {
        l++;
    }
    if(n > nr * l)
    {
        nr++;
    }

    sirul();

    while(x < n)
    {
        v1[x] = minimsm();
        x++;
    }

    for(int i = 0; i < n; ++i)
    {
        fout<<v1[i]<<" ";
    }
}