Cod sursa(job #1655345)

Utilizator razvandRazvan Dumitru razvand Data 17 martie 2016 21:59:42
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <stdio.h>
#define MAXBUF 10000
using namespace std;

FILE *fin = fopen("algsort.in", "r");
FILE *fout = fopen("algsort.out", "w");

int mx;
int arr[500003];
int n;
char c[MAXBUF];
char o[MAXBUF];
int k = MAXBUF;
int q = 0;
queue<int> qu[1000];
queue<int> emp;

inline char nextch() {
    if(k == MAXBUF) {
        fread(c, 1, MAXBUF, fin);
        k = 0;
    }
    if(c[k+1] == '\0')
        return '\0';
    return c[k++];
}

inline int read() {

    int x = 0;
    char ch = nextch();

    while(!isdigit(ch))
        ch = nextch();

    while(isdigit(ch)) {
        x = x*10 + ch - '0';
        ch = nextch();
    }

    return x;

}

inline void putch(char ch) {
    o[q++] = ch;
    if(q == MAXBUF) {
        fwrite(o, MAXBUF, 1, fout);
        q = 0;
    }
}
int s;
char c2[10];
inline void put(int x) {

    s = 0;

    while(x > 0) {
        c2[s++] = x%10;
        x /= 10;
    }

    while(s > 0) {
        putch(c2[s-1]+'0');
        s--;
    }

}

void countSort(int exp) {

    for(int i = 0; i < 1000; i++)
        qu[i] = emp;

    for(int i = 0; i < n; i++)
        qu[(arr[i]/exp)%1000].push(arr[i]);

    int cnt = 0;

    for(int i = 0; i < 1000; i++) {

        while(!qu[i].empty()) {

            arr[cnt++] = qu[i].front();
            qu[i].pop();

        }

    }

}

void radixsort() {

    int m = mx;

    for (int exp = 1; m/exp > 0; exp *= 1000)
        countSort(exp);

}

int main() {
    n = read();
    for(int i = 0; i < n; i++) {
        arr[i] = read();
        if(arr[i] > mx)
            mx = arr[i];
    }

    radixsort();

    for (int i = 0; i < n; i++) {
        put(arr[i]);
        putch(' ');
    }
    fwrite(o, q, 1, fout);

    return 0;
}