Cod sursa(job #2559484)

Utilizator danielsociuSociu Daniel danielsociu Data 27 februarie 2020 12:42:20
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <bits/stdc++.h>
using namespace std;
#define st first
#define nd second
#define pb push_back
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define FORS(i,a,b) for(int i=(a);i<(b);++i)
#define PII pair<int,int>
#define VI vector<int>
#define VPII vector<PII>
#define all(x) x.begin(),b.end()
#define SZ(x) ((int)(x).size())
#define ll long long
#define MOD 10000000 //998244353
const int inf=0x3f3f3f3f;
#define maxn 500005
 
///buckets of bytes
#define maxb 8
#define bucket 0xFF //255,a byte aka bits 0-7(8 bits)
#define total_bytes (sizeof(v[1]))
#define get_byte(x) ((x>>(byte*8))&bucket)
 
 
int n,vec[maxn];
 
void printer(int* v){
    FORS(i,0,n)
        cout<<v[i]<<'\n';
}
 
bool verifier(int *v){
    int *a=new int[n];
    memcpy(a,v,sizeof(int)*n);
    sort(a,a+n);
    FORS(i,0,n)
        if(a[i]!=v[i])
                return 0;
    return 1;
}
 
/// BUBBLE SORT
void bubbleSort(int* v)
{
    FORS(i,0,n-1)
        FORS(j,0,n-i-1)
            if(v[j]>v[j+1])
                swap(v[j],v[j+1]);
}
 
/// COUNT SORT
void countSort(int* v)
{
    int maxi=0;
    FORS(i,0,n)
        if(v[i]>maxi)
            maxi=v[i];
    int freq[maxi+2];
    memset(freq,0,sizeof(freq));
    FORS(i,0,n)
        freq[v[i]]++;
    int j=0;
    FOR(i,0,maxi)
        while(freq[i]){
            v[j++]=i;
            --freq[i];
        }
}
 
 
/// RADIX SORT
void countByteSort(int byte,int *v)
{
    int count[1<<maxb];
    int index[1<<maxb];
    int aux[n+5];
    //int *aux=new int[n];
    index[0]=0;
    memset(count,0,sizeof(count));
 
    FORS(i,0,n)
        count[get_byte(v[i])]++;
    FORS(i,1,(1<<maxb))
        index[i]=index[i-1]+count[i-1];
    FORS(i,0,n)
        aux[index[get_byte(v[i])]++]=v[i];
    FORS(i,0,n)
        v[i]=aux[i];
    //return aux;
}
 
void radixSort(int* v)
{
    for(unsigned int bit=0;bit<total_bytes;++bit)
        countByteSort(bit,v);
        //v=countSort(bit,v);
}
 
void quicksort(int* v)
{

    cout<<1;
 
}
 
int main()
{
    freopen("algsort.in","r",stdin);
    //freopen("algsort.out","w",stdout);
    cin>>n;
    FORS(i,0,n)
        cin>>vec[i];
    countSort(vec);
    FORS(i,0,n)
        cout<<vec[i]<<' ';
/*    n=maxn;
    int v[n+2];
    for(int i=0;i<n;i++)
        v[i]=n-i;
    radixSort(v);
    if(verifier(v))
        cout<<"YAS";
    else
        cout<<"NO";
    //printer(v);
*/
}