Pagini recente » Cod sursa (job #2445019) | Cod sursa (job #1570946) | Cod sursa (job #2169603) | Cod sursa (job #456735) | Cod sursa (job #2676774)
#include <iostream>
#include <stdio.h>
#define NMAX 500000
#define NRBUCKETS (1 << 16)
#define VALUES_PER_BUCKET_BITS 15
using namespace std;
FILE *fin, *fout;
int n;
int v[NMAX + 1], v1[NMAX + 1], f[NRBUCKETS + 1], ind[NRBUCKETS + 1];
inline int bucketnr(int x) {
return x >> VALUES_PER_BUCKET_BITS;
}
void citire() {
int i;
fin = fopen("algsort.in", "r");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fin, "%d", &v[i]);
fclose( fin );
}
void mysort(int begin, int end) {
int b, e, piv, aux;
b = begin; e = end; piv = v1[(b + e) / 2];
while (v1[b] < piv)
b++;
while (v1[e] > piv)
e--;
while (b < e) {
aux = v1[b]; v1[b] = v1[e]; v1[e] = aux;
do b++; while (v1[b] < piv);
do e--; while (v1[e] > piv);
}
if (begin < e)
mysort(begin, e);
if (e + 1 < end)
mysort(e + 1, end);
}
void afis() {
int i;
fout = fopen("algsort.out", "w");
for (i = 0; i < n; i++)
fprintf(fout, "%d ", v1[i]);
fclose( fout );
}
int main() {
int i, maxbuck, nr;
citire();
maxbuck = 0;
for (i = 0; i < n; i++) {/// vad cate numere am in fiecare bucket
nr = bucketnr(v[i]);
f[nr]++;
if (nr > maxbuck)
maxbuck = nr;
}
for (i = 1; i <= maxbuck; i++)/// setez prima poz libera al fiecarui bucket
ind[i] = ind[i - 1] + f[i - 1];
for (i = 0; i < n; i++) { /// adaug in vectorul v1 numerele, in ordinea bucketurilor
nr = bucketnr(v[i]);
v1[ind[nr]] = v[i];
ind[nr]++;
}
mysort(0, f[0] - 1);
for (i = 1; i <= maxbuck; i++) {
f[i] += f[i - 1];
mysort(f[i - 1], f[i] - 1);
}
afis();
return 0;
}