Pagini recente » Cod sursa (job #1444978) | Cod sursa (job #593702) | Cod sursa (job #760795) | Cod sursa (job #2503228) | Cod sursa (job #793901)
Cod sursa(job #793901)
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#define N_MAX 500000
int N;
int v[N_MAX], vAux[N_MAX];
int count[65536];
template<typename T>
inline void swap(T& x, T& y) {
T z = x;
x = y;
y = z;
}
inline void read() {
std::ifstream fin("algsort.in");
fin >> N;
for (int i = 0; i < N; ++i) {
fin >> v[i];
}
fin.close();
}
inline void countAndOrder(int N, int src[], int dest[], int shiftBy) {
static const int radix = 65535;
memset(count, 0, sizeof(count));
for (int i = 0; i < N; ++i) {
++count[(src[i] >> shiftBy) & radix];
}
for (int i = 1; i <= radix; ++i) {
count[i] += count[i - 1];
}
int x, fromFirstBucket = 0;
for (int i = 0; i < N; ++i) {
x = (src[i] >> shiftBy) & radix;
if (x == 0) {
dest[fromFirstBucket++] = src[i];
} else {
dest[count[x - 1]++] = src[i];
}
}
}
void radixsort() {
countAndOrder(N, v, vAux, 0);
countAndOrder(N, vAux, v, 16);
}
inline void print() {
std::ofstream fout("algsort.out");
fout << v[0];
for (int i = 1; i < N; ++i) {
fout << ' ' << v[i];
}
fout << '\n';
fout.close();
}
int main() {
srand(time(NULL));
read();
radixsort();
print();
return 0;
}