Cod sursa(job #2618069)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 23 mai 2020 16:48:35
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <fstream>
#include<cstdlib>
using namespace std;

ifstream fin ("algsort.in");
ofstream fout ("algsort.out");
int a[500000], ordonat[500000];
int put10[10]={1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};

/*void mergesort( int st, int dr )
{
    if(st!=dr)
    {
        int mij=((st+dr)>>1);
        mergesort(st,mij);
        mergesort(mij+1,dr);
        int k,j,cpst=st;
        k=st;
        j=mij+1;
        while(k<=mij && j<=dr)
            if(v[k]<v[j])
                a[st++]=v[k++];
            else
                a[st++]=v[j++];
        while(k<=mij)
            a[st++]=v[k++];
        while(j<=dr)
            a[st++]=v[j++];
        for(j=cpst;j<=dr;j++)
            v[j]=a[j];
    }
}
void quick_like_sonic_sort(int v[], int left, int right)
{
    if(left<right)
    {
        int pivot=v[left+rand()%(right-left)];
        int e=right, b=left;
        while(v[e]<pivot)
            e--;
        while(v[b]>pivot)
            b++;
        while(b<e)
        {
            swap(v[b], v[e]);
            do
                e--;
            while(v[e]<pivot);
            do
                b++;
            while(v[b]>pivot);
        }
        quick_like_sonic_sort(v, left, e);
        quick_like_sonic_sort(v, e+1, right);

    }
}*/

void couning_sort(int v[], int right, int exp)
{
    int freq[10]={0};
    int i;
    for(i=0 ; i<=right ; i++)
        freq[(v[i]/put10[exp])%10]++;
    for(i=1 ; i<10 ; i++)
    {
         freq[i]+=freq[i-1];
    }
    for(i=right ; i>=0 ; i--)
    {
        ordonat[freq[(v[i]/put10[exp])%10]-1]=v[i];
        freq[(v[i]/put10[exp])%10]--;
    }
    for(i=0 ; i<=right ; i++)
         v[i]=ordonat[i];
}
int maxx;
void ridiche_sort(int v[], int right)
{
    int j;
    for(j=0 ; j<10 && put10[j]<=maxx ; j++)
        couning_sort(a, right, j);
}

int main()
{
    int i,n;
    fin >>n;
    maxx=0;
    for(i=0;i<n;i++)
    {
        fin >> a[i];
        if(maxx<a[i])
            maxx=a[i];
    }

    ridiche_sort(a, n-1);
    for(i=0;i<n;i++)
        fout << ordonat[i] << " ";

    return 0;
}