Cod sursa(job #381075)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 8 ianuarie 2010 19:17:04
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
# include <cstdio>
# include <stdlib.h>

using namespace std;

# define FIN "algsort.in"
# define FOUT "algsort.out"
# define MAX_N 500005
# define Baza 30

int N, i;
int A[MAX_N], B[MAX_N], ct1[Baza], ct2[Baza];

    void radix(int st, int dr, int nc)
    {
        int i, ind;
        
        if (dr <= st) return;
        
        for (i = 0; i <= 9; ++i) ct1[i] = ct2[i] = 0;
        for (i = st; i <= dr; ++i) ct1[(A[i] % nc - A[i] % (nc / 10)) / (nc / 10)]++;
        for (i = 1; i <= 9; ++i) ct1[i] = ct1[i] + ct1[i - 1];
        
        for (i = st; i <= dr; ++i)
        {
            ind = (A[i] % nc - A[i] % (nc / 10)) / (nc / 10);
            B[ct1[ind - 1] + ct2[ind] + 1] = A[i];
            ct2[ind]++;
        }
        
        for (i = st; i <= dr; ++i) A[i] = B[i - st + 1];
        radix(1, ct2[i], nc * 10);
        for (i = 1; i <= 9; ++i) radix(ct1[i - 1] + 1, ct1[i - 1] + ct2[i], nc * 10);
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        scanf("%d", &N);
        for (i = 1; i <= N; ++i) scanf("%d", &A[i]);
        
        radix(1, N, 10);
        
        for (i = 1; i <= N; ++i) printf("%d ", A[i]);
        
        return 0;
    }