Cod sursa(job #2726419)

Utilizator AkrielAkriel Akriel Data 20 martie 2021 21:48:56
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int fragments = 256;

fstream fin("algsort.in");
ofstream fout("algsort.out");

vector<int> initialNumbers;

double EPS = 1e-6;

void akySort(vector<int>& numbers){
    if (numbers.size() < fragments*4){
        sort(numbers.begin(), numbers.end());
        return;
    }

    int maxValue = numbers[0];
    for (auto const &el : numbers){
        maxValue = max(maxValue, el);
    }

    double step = (double)(maxValue) / (double)(fragments);
    vector<int> buckets[fragments];
    for (auto const &el : numbers){
        int index = min((int)(el / step), 255);
        buckets[index].push_back(el);
    }

    vector<int> result;
    for (auto & bucket : buckets){
        if (bucket.size() == numbers.size()){
            sort(bucket.begin(), bucket.end());
            goto push_elem;
        }

        akySort(bucket);

        push_elem:
        for (auto & el : bucket){
            result.push_back(el);
        }
    }
    numbers = result;
}

int main() {
    int n = 1e5;
    fin >> n;
    initialNumbers.resize(n);
    for (auto &el : initialNumbers){
        fin >> el;
    }
    akySort(initialNumbers);
    for (auto &el : initialNumbers){
        fout << el << " ";
    }
    return 0;
}