Pagini recente » Cod sursa (job #2692006) | Cod sursa (job #2802850) | Cod sursa (job #235199) | Cod sursa (job #2660152) | Cod sursa (job #2680790)
#include <stdio.h>
#define NMAX 500000
#define NR_BUCKETS (1 << 16)
#define VALUES_PER_BUCKETS_BITS 15
using namespace std;
int v[NMAX + 3], v1[NMAX + 3], f[NR_BUCKETS + 3], ind[NR_BUCKETS + 3];
inline int bucketnr(int a){
return a >> VALUES_PER_BUCKETS_BITS;
}
void myqsort(int begin, int end){
int b = begin, e = end, piv = v1[(b + e) / 2], aux;
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)
myqsort(begin, e);
if (e + 1 < end)
myqsort(e + 1, end);
}
int main(){
FILE *fin ,*fout;
fin = fopen("algsort.in","r");
fout = fopen("algsort.out","w");
int nr,n,maxx;
maxx = 0;
fscanf(fin ,"%d" ,&n);
for (int i = 0;i < n; ++i)
fscanf(fin ,"%d", &v[i]);
for (int i = 0; i < n; ++i){
nr = bucketnr(v[i]);
f[nr] ++;
if(nr > maxx){
maxx = nr;
}
}
for (int i = 1; i <= maxx; ++i){
ind[i] = ind[i - 1] + f[i - 1];
}
for (int i = 0; i < n; ++i){
nr = bucketnr(v[i]);
v1[ind[nr]] = v[i];
ind[nr] ++;
}
myqsort ( 0 , f[0] - 1);
for (int i = 1;i <= maxx; ++i) {
f[i] += f[i - 1];
myqsort(f[i - 1] ,f[i] - 1);
}
for (int i = 0; i < n; ++i){
fprintf(fout ,"%d " ,v1[i]);
}
return 0;
}