Pagini recente » Cod sursa (job #3286330) | Cod sursa (job #105980) | Cod sursa (job #170667) | Cod sursa (job #1323118) | Cod sursa (job #412047)
Cod sursa(job #412047)
// Catalin Balan
// Fri Mar 5 11:56:04 EET 2010
// Radix Sort
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
#define NMAX 500003
#define CHUNK 8192
#define SIGMA 1024
#define FIN "algsort.in"
#define FOUT "algsort.out"
char g_buf[CHUNK];
int g_p=CHUNK-1;
inline int get()
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
}
return x;
}
int a[NMAX], n, maxim;
queue<int> bucket[SIGMA];
int main(int argv, char ** argc)
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
n = get();
for (int i = 1; i <= n; ++i)
{
a[i] = get();
maxim = max(maxim, a[i]);
}
int e = 0;
int start = 1;
while (maxim)
{
int i, j;
for (i = start; i <= n; ++i)
{
bucket[ (a[i]>>e)&1023 ].push(a[i]);
}
for (j = 0, i = start-1; j < SIGMA; ++j)
{
while (!bucket[j].empty())
{
a[++i] = bucket[j].front();
bucket[j].pop();
//if (a[i]/e == 0) ++start;
}
}
e += 10;
maxim >>=10;
}
for (int i = 1; i <= n; ++i)
printf("%d ", a[i]);
return EXIT_SUCCESS;
}