Cod sursa(job #1754862)

Utilizator sulzandreiandrei sulzandrei Data 8 septembrie 2016 21:01:34
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <unordered_map>
using namespace std;

#define nmax 500003


ifstream in("radixsort.in");
ofstream out("radixsort.out");

//////////////////////////////
///////////
///////////      LSD Radix sort using countsort for bytes
///////////
//////////////////////////////
#define max_n 10000000+1
int v[max_n],temp[max_n];

const int max_byte = (1<<8)-1;
const int nr_bytes = sizeof(int);
inline int ithbyte(int n,int i)
{
    return (n>>(i*8))&max_byte;
}
void byte_numsort(int *A, int *B,int n, int byte_nr)
{
    int C[max_byte+1];
    int index[max_byte+1];
    for(int i = 0 ; i <= max_byte ; i ++)
        C[i] = 0;
    for(int i = 0 ; i < n ; i ++)
        C[ithbyte(A[i],byte_nr)]++;
    index[0] = 0;
    for(int i = 1 ; i <= max_byte; i++)
        index[i] = index[i-1]+C[i-1];
    for(int i = 0 ; i < n ; i++)
    {
        B[index[ithbyte(A[i],byte_nr)]] = A[i];
        index[ithbyte(A[i],byte_nr)]++;
    }
    for(int i = 0 ;  i< n ; i++)
        A[i] = B[i];
}
void LSD_byte_radixsort(int *v, int n)
{

    for(int i = 0 ; i< nr_bytes ; i++)
        byte_numsort(v,temp,n,i);
}
vector<int> bucket[10];
void LSD_digit_radixsort(int *v, int n)
{
    int max_el = *max_element(v,v+n);
    int digits = 0;
    do{max_el/=10;digits++;}while(max_el);
    int pow10[10];
    pow10[0] = 1;
    for(int i = 1 ; i <= 9 ; i++)
        pow10[i] = pow10[i-1]*10;
    int k;
    for(int i = 0 ; i < digits ; i++)
    {
        for(int j = 0 ; j < n ; j++)
            bucket[(v[j]/pow10[i])%10].push_back(v[j]);
        k = 0;
        for(int j = 0 ; j <= 9 ; j++)
        {
            for(const auto& nr:bucket[j])
                v[k++] = nr;
            bucket[j].clear();
        }
    }
}
void radixsort()
{
    int n,a,b,c;
    in >> n >> a >> b >> c;
    v[0] = b%c;
    for(int i = 1 ; i < n ; i++)
        v[i] =(1LL*a*v[i-1]%c+b)%c;
    LSD_byte_radixsort(v,n);
    //LSD_digit_radixsort(v,n);
    for(int i = 0 ; i < n ; i +=10)
        out << v[i] << " ";
}
int main()
{
    radixsort();
    return 0;
}