Pagini recente » Cod sursa (job #893199) | Cod sursa (job #3164330) | Cod sursa (job #195315) | Cod sursa (job #2739754) | Cod sursa (job #1655407)
#include <iostream>
#include <fstream>
#include <queue>
#include <stdio.h>
#define MAXBUF 10000
using namespace std;
//FILE *fin = fopen("algsort.in", "r");
ifstream in("algsort.in", ifstream::binary);
//FILE *fout = fopen("algsort.out", "w");
ofstream out("algsort.out", ofstream::binary);
int mx;
int arr[500003];
int n;
char c[MAXBUF] = {'\0'};
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);
in.read(c, MAXBUF);
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;
}
inline void putch(char ch) {
o[q++] = ch;
if(q == MAXBUF) {
//fwrite(o, MAXBUF, 1, fout);
out.write(o, MAXBUF);
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(' ');
}
out.write(o, q);
//fwrite(o, q, 1, fout);
return 0;
}