Cod sursa(job #1769589)

Utilizator Y0da1NUME JMECHER Y0da1 Data 2 octombrie 2016 19:45:07
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <string.h>

#define RADIX_SIZE 8
#define TOTAL_BYTES sizeof(int)

#define get_byte(x) ((x>>(byte * 8))&0xFF)
using namespace std;
int n , a, b , c;
unsigned int v [10000001];
void countsort(int * A, int * B, int byte)
{
    ++B;
    int counter[1<<RADIX_SIZE];
    int total, aux;
    memset(counter, 0, sizeof(counter));

    for(int i=1;i<=n;++i)
        ++counter[get_byte(A[i])];
    total=0;
    for(int i=0;i<1<<RADIX_SIZE;++i)
    {
        aux = counter[i];
        counter[i] = total;
        total += aux;
    }
    for(int i = 1; i <= n; ++i)
    {
        B[counter[get_byte(A[i])]] = A[i];
        counter[get_byte(A[i])]++;
    }

}
int main ()
{
    ifstream in ("radixsort.in");
    ofstream out ("radixsort.out");
    in>> n >> a >> b >> c;
    v[1]=b;
    for(int i=2;i<=n;++i)
    {
        v[i] = (a * v[i-1] + b) % c;    //generam
       // cout<<v[i]<<" ";
    }
    int * secarray = new int [n+1];
    for (int i = 0; i < TOTAL_BYTES; i ++)
    {
        if(i % 2 == 0)
            countsort(v, secarray, i);// sortez dupa byteul i
        else
            countsort(secarray, v, i);  //pun din primu in al 2-lea si din al 2-lea in primu pt a economisi spatiu
    }
    //cout<<"DWAAAAAAAAAAAAAA";
    for(int i = 1; i <= n;i+=10)
        out << v[i]<<" ";
    in.close();
    out.close();
    return 0;

}