Cod sursa(job #2531730)

Utilizator victorzarzuZarzu Victor victorzarzu Data 26 ianuarie 2020 18:01:41
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
ofstream g("algsort.out");
int p = 31999;
char buffer[32010];
int n;
int v[500000];
int m = -INFINITY;
void inc()
{
    ++p;
    if(p == 32000)
    {
        fread(buffer,1,32000,stdin);
        p = 0;
    }
}

void read(int &x)
{
    x = 0;
    while(buffer[p] < '0' || buffer[p] > '9')
        inc();
    while(buffer[p] >= '0' && buffer[p] <= '9')
    {
        x = x * 10 + buffer[p] - '0';
        inc();
    }
}

void Read()
{
    freopen("algsort.in","r",stdin);
    read(n);
    for(int i = 0;i < n;++i)
    {
        read(v[i]);
        if(v[i] > m)
            m = v[i];
    }
}

void countSort(int v[],int n,int exp)
{
    int output[n];
    int i, count[10] = {0};

    for(int i = 0;i < n;++i)
        count[(v[i] / exp) % 10] ++;

    for(int i = 1;i < 10;++i)
        count[i] += count[i - 1];

    for(int i = n - 1;i >= 0;--i)
    {
        output[count[(v[i] / exp) % 10] - 1] = v[i];
        count[(v[i] / exp) % 10]--;
    }

    for(int i = 0;i < n;++i)
        v[i] = output[i];
}

void RadixSort(int v[],int n)
{
    for(int exp = 1;m/exp > 0;exp *= 10)
        countSort(v,n,exp);
}

void Print()
{
    for(int i = 0;i < n;++i)
        g<<v[i]<<" ";
    g.close();
}

int main()
{
    Read();
    RadixSort(v,n);
    Print();
    return 0;
}