Pagini recente » Cod sursa (job #1050642) | Cod sursa (job #3149384) | Cod sursa (job #1652283) | Cod sursa (job #2258409) | Cod sursa (job #1509814)
#include <fstream>
#include <cstring>
#define NMAX 10000005
//#define NMAX 500005
#define RADIX 0xFF
#define RADIX_SIZE 8
#define NR_BYTES sizeof(int)
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
//ifstream fin("radixsort.in");
//ofstream fout("radixsort.out");
int n;
int v[NMAX], w[NMAX];
inline int getByte(int x, int byte)
{
return (x >> (RADIX_SIZE * byte) & RADIX);
}
void countsort(int *a, int *b, int byte)
{
int buckets[1 << RADIX_SIZE];
int index[1 << RADIX_SIZE];
memset(buckets, 0, sizeof(buckets));
index[0] = 1;
for (int i = 1; i <= n; ++i)
++buckets[getByte(b[i], byte)];
for (int i = 1; i < (1 << RADIX_SIZE); ++i)
index[i] = index[i - 1] + buckets[i - 1];
for (int i = 1; i <= n; ++i)
a[index[getByte(b[i], byte)]++] = b[i];
}
void radixsort()
{
for (int i = 0; i < NR_BYTES; ++i)
{
if (i & 1) countsort(v, w, i);
else countsort(w, v, i);
}
}
int main()
{
/*
int a, b, c;
fin >> n >> a >> b >> c;
v[1] = b;
for (int i = 2; i <= n; ++i)
v[i] = (1LL * a * v[i - 1] + b) % c;
*/
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> v[i];
radixsort();
/*
for (int i = 1; i <= n; i += 10)
fout << v[i] << ' ';
fout << '\n';
*/
for (int i = 1; i <= n; ++i)
fout << v[i] << ' ';
fout << '\n';
return 0;
}