Cod sursa(job #2554727)

Utilizator vlcosminCosmin vlcosmin Data 23 februarie 2020 12:33:00
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include<cstdio>
#include<vector>
#include<cctype>
#define MAX_BUCKETS 10
#define BUF_SIZE 1 << 19
#define BASE 10
using namespace std;

vector<int>v;
char buf[BUF_SIZE];
int n, a, b, c, maxim, pos = BUF_SIZE;
vector<int>g[MAX_BUCKETS];

inline char getChar(FILE* fin) {
    if(pos == BUF_SIZE) {
        fread(buf, 1, BUF_SIZE, fin);
        pos = 0;
    }
    return buf[pos++];
}

inline int read(FILE* fin) {
    int res = 0;
    char ch;
    do {
        ch = getChar(fin);
    }while(!isdigit(ch));
    do {
        res = 10*res + ch - '0';
        ch = getChar(fin);
    }while(isdigit(ch));
    return res;
}

void readArray() {
    FILE* fin = fopen("radixsort.in", "r");
    n = read(fin);
    a = read(fin);
    b = read(fin);
    c = read(fin);
    v.push_back(b);
    maxim = b;
    // vectorul e construit pe baza unei formule
    for(int i = 1; i < n; i++) {
        v.push_back((a * v[v.size() - 1] + b) % c);
        if(v[v.size() - 1] > maxim)
            maxim = v[v.size() - 1];
    }
    fclose(fin);
}

void radixSort(vector<int> &a) {
    vector<int>::iterator it;
    int i, exp, m;
	g.erase();
    for(exp = 1; maxim / exp > 0; exp *= 10) {
        /*
            Pe infoarena avem v <= 10.000.000, iar daca declar local vectorul de liste g ( cel de mai jos), imi
            iese din memorie. As putea sa fac altfel? Ideea e ca trebuie ca el sa fie gol de fiecare data,
            nu sa-mi scrie peste ce am inserat la pasul anterior.
        */
        for(it = a.begin(); it != a.end(); ++it)
            g[((*it) / exp) % BASE].push_back((*it));
        m = 0;
        // urmeaza sa suprascriu vectorul si sa trecem la cifra urmatoare ( exp *= 10)
        for(i = 0; i < BASE; ++i) {
            for(it = g[i].begin(); it != g[i].end(); ++it)
                a[m++] = (*it);
        }
    }
	 for(i = 0; i <BASE; i++)
            g[i].clear();
    }
}

void writeArray() {
    FILE* fout = fopen("radixsort.out", "w");
    // afisez din 10 in 10, conform cerintei de pe infoarena
    for(int i = 0; i < v.size(); i += 10)
        fprintf(fout,"%d ",v[i]);
    fprintf(fout,"\n");
    fclose(fout);
}

int main() {
    readArray();
    radixSort(v);
    writeArray();
    return 0;
}