Cod sursa(job #3206264)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 22 februarie 2024 09:37:49
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
int n, v[500005], copiere[500005], fr[10];
int maximu(int n)
{
    int maxi = INT_MIN;
      for(int i = 0; i < n; ++i)
      {
          maxi = max(v[i], maxi);
      }
      return maxi;
}

void radix(int n, int exponent)
{
    int fr[10] = {0}, copiere[500005] = {0};
    for(int i = 0; i < n; ++i)
    {
        fr[(v[i] / exponent) % 10]++;
    }
    for(int  i= 1; i <= 9; ++i)
    {
        fr[i] += fr[i - 1];
    }
    for(int i = n - 1; i >= 0; --i)
    {
        copiere[fr[(v[i] / exponent) % 10] - 1] = v[i];
        fr[(v[i] / exponent) % 10]--;
    }
    for(int  i= 0; i < n; ++i)
    {
        v[i] = copiere[i];
    }
}
void sortare(int n)
{
    int maxim = maximu(n);
    for(int exponent = 1; maxim / exponent > 0; exponent *= 10)
    {
        radix(n, exponent);
    }
}
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int32_t main(int argc, char * argv[])
{
    fin >> n;
    for(int i = 0; i < n; ++i)
    {
        fin >> v[i];
    }
    sortare(n);
    for(int i = 0; i < n; ++i)
    {
        fout << v[i] << " ";
    }
    return 0;
}