Cod sursa(job #1655290)

Utilizator razvandRazvan Dumitru razvand Data 17 martie 2016 21:23:22
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
// C++ implementation of Radix Sort
#include <iostream>
#include <fstream>
#include <queue>
#include <stdio.h>
#define MAXBUF 10000
using namespace std;

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

int mx;
int arr[500003];
int n;
char c[MAXBUF];
int k = MAXBUF;

inline char nextch() {
    if(k == MAXBUF) {
        fread(c, 1, MAXBUF, fin);
        k = 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;

}

void countSort(int exp) {
    int i;
    queue<int> qu[1000];

    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() {
    //in >> n;
    n = read();
    for(int i = 0; i < n; i++) {
        //in >> arr[i];
        arr[i] = read();
        if(arr[i] > mx)
            mx = arr[i];
    }

    radixsort();

    for (int i = 0; i < n; i++)
        out << arr[i] << " ";

    return 0;
}