Cod sursa(job #3124403)

Utilizator daristyleBejan Darius-Ramon daristyle Data 28 aprilie 2023 15:38:15
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#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;
}