Cod sursa(job #2392173)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 29 martie 2019 19:02:29
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;

const int nMax = 500005;
const int base = 256;

int n;
int v[nMax];

void citire()
{
    ifstream in("algsort.in");
    in >> n;
    for(int i = 1; i <= n; ++i)
        in >> v[i];
    in.close();
}

inline int GetMax()
{
    int ret = v[1];
    for(int i = 2; i <= n; ++i)
        ret = max(ret, v[i]);
    return ret;
}

inline int GetDigit(int x, int d)
{
    return (x / d) % base;
}

void count_sort(int digit)
{
    static int temp[nMax];
    static int cnt[base];

    for(int i = 0; i < base; ++i)
        cnt[i] = 0;
    for(int i = 1; i <= n; ++i)
        cnt[GetDigit(v[i], digit)]++;
    for(int i = 1; i < base; ++i)
        cnt[i] = cnt[i-1] + cnt[i];
    for(int i = n; i >= 1; --i)
        temp[cnt[GetDigit(v[i], digit)]--] = v[i];
    for(int i = 1; i <= n; ++i)
        v[i] = temp[i];
}

void radix_sort()
{
    long long mx = GetMax();

    for(long long i = 1; mx / i > 0; i *= base)
        count_sort(i);
}


void afisare()
{
    ofstream out("algsort.out");
    for(int i = 1; i <= n; ++i)
        out << v[i] << " ";
    out.close();
}

int main()
{
    citire();
    radix_sort();
    afisare();
    return 0;
}