Cod sursa(job #1477867)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 august 2015 11:26:33
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_DIGITS = 32;
const int MAX_D = 4;
const int SIZE_RADIX = 1 << (MAX_DIGITS / MAX_D);
const int mask = SIZE_RADIX - 1;

void radix_sort(int A[], int N, int B[], int C[])
{
    for (int d = 0, shift = 0; d < MAX_D; d++, shift += (MAX_DIGITS / MAX_D))
    {
        for (int i = 0; i < SIZE_RADIX; ++i)
            C[i] = 0;

        for (int i = 0; i < N; ++i)
            C[ (A[i] >> shift) & mask ]++;

        for (int i = 1; i < SIZE_RADIX; ++i)
            C[i] += C[i - 1];

        for (int i = N - 1; i >= 0; i--)
            B[ --C[ (A[i] >> shift) & mask ] ] = A[i];

        for (int i = 0; i < N; ++i)
            A[i] = B[i];
    }
}

const int MAX_N = 500000 + 1;

int A[MAX_N], B[MAX_N];
int C[SIZE_RADIX];
int N;

int main()
{
    ifstream in("algsort.in");
    ofstream out("algsort.out");

    in >> N;

    for (int i = 0; i < N; ++i)
        in >> A[i];

    radix_sort(A, N, B, C);

    for (int i = 0; i < N; ++i)
        out << A[i] << " ";

    return 0;
}