Pagini recente » Cod sursa (job #3212810) | Cod sursa (job #140635) | Cod sursa (job #3157020) | Cod sursa (job #1077609) | Cod sursa (job #870280)
Cod sursa(job #870280)
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstring>
#define MAXRAD 65537
#define MAXN 500005
using namespace std;
typedef unsigned int uint32;
uint32 counts[MAXRAD];
uint32 in[MAXN];
uint32 out[MAXN];
void radix_pass(uint32 in[], int n, int radix, uint32 out[])
{
memset(counts, 0, MAXRAD*sizeof(uint32));
for (int i=0; i<n; ++i)
{
++counts[(in[i] >> (16 * radix)) & 0xFFFF];
}
uint32 prevCount = counts[0];
counts[0] = 0;
for (int i=1; i<MAXRAD; ++i)
{
const uint32 aux = counts[i-1] + prevCount;
prevCount = counts[i];
counts[i] = aux;
}
for (int i=0; i<n; ++i)
{
out[counts[(in[i] >> (16 * radix)) & 0xFFFF]++] = in[i];
}
}
int main()
{
int n;
fstream fin("algsort.in", fstream::in);
fstream fout("algsort.out", fstream::out);
fin >> n;
//cout << n << "\n";
istream_iterator<int> itIn(fin), itEof;
ostream_iterator<int> itOut(fout, " ");
copy(itIn, itEof, in);
//copy(in, in+n, itOut);
//cout << "\n";
radix_pass(in, n, 0, out);
radix_pass(out, n, 1, in);
copy(in, in+n, itOut);
fout << "\n";
return 0;
}