Pagini recente » Diferente pentru problema/zigzag intre reviziile 9 si 8 | Borderou de evaluare (job #1791781) | Monitorul de evaluare | Cod sursa (job #3239796) | Cod sursa (job #3124403)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int N_MAX=5e5;
const int NO_BUCKETS=1<<16;
const int VALUES_PER_BUCKET=1<<15;
const int VALUES_PER_BUCKET_BITS=15;
const int FREQ_SIZE=NO_BUCKETS>VALUES_PER_BUCKET?NO_BUCKETS:VALUES_PER_BUCKET;
int w[N_MAX], v[N_MAX];
int freq[FREQ_SIZE]{}, index[NO_BUCKETS+1];
void CountingSort(int v[],int b, int e, int bucket){
for(int i=-0; i<VALUES_PER_BUCKET; ++i)
freq[i]=0;
int minval=bucket<<VALUES_PER_BUCKET_BITS;
for(int i=b; i<e; ++i)
++freq[v[i]-minval];
int index=b;
for(int i=0; i<VALUES_PER_BUCKET; ++i)
for(int j=0; j<freq[i]; ++j)
v[index++]=i+minval;
}
inline int getBucket(int x){
return x>>VALUES_PER_BUCKET_BITS;
}
void BucketSort(int w[], int n){
for(int i=0; i<n; ++i)
++freq[getBucket(w[i])];
int start=0,aux;
for(int i=0; i<NO_BUCKETS; ++i){
aux=freq[i];
freq[i]=index[i]=start;
start+=aux;
}
for(int i=0; i<n; ++i)
v[index[getBucket(w[i])]++]=w[i];
for(int i=0; i<NO_BUCKETS; ++i)
index[i]=freq[i];
index[NO_BUCKETS]=n;
for(int i=0; i<NO_BUCKETS; ++i)
if(index[i+1]-index[i]>1)
sort(v + index[i], v+index[i+1]);
for(int i=0; i<n; ++i)
w[i]=v[i];
}
int main() {
int n;
fin>>n;
for(int i=0; i<n; ++i)
fin>>w[i];
BucketSort(w, n);
for(int i=0; i<n; ++i)
fout<<w[i]<<' ';
fout.put('\n');
return 0;
}