Cod sursa(job #2000755)

Utilizator aaether14Dinescu Stefan Cristian aaether14 Data 14 iulie 2017 17:42:06
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <vector>

template<typename T>
void insertion_sort(T* array, ssize_t left, ssize_t right)
{
        for (ssize_t it = left + 1; it <= right; ++it)
        {
                T key = array[it];
                auto it2 = it - 1u;
                while (it2 >= left && array[it2] > key)
                {
                        array[it2 + 1] = array[it2];
                        --it2;
                }
                array[it2 + 1] = key;
        }
}

template<typename T>
void merge(T* input, T* output, ssize_t left, ssize_t right, ssize_t middle)
{

        for (auto i = left, j = middle + 1, k = left; i <= middle || j <= right;)
        {
                if (j > right || (i <= middle && input[i] < input[j]))
                        output[k++] = input[i++];
                else
                        output[k++] = input[j++];

        }
}

template<typename T>
void merge_insertion_sort(T* input, T* output, ssize_t left, ssize_t right)
{
        if (left >= right) return;
        if (right - left <= 15)
                insertion_sort(input, left, right);
        else
        {
                auto middle = (left + right) >> 1;
                merge_insertion_sort(input, output, left, middle);
                merge_insertion_sort(input, output, middle + 1, right);
                merge(input, output, left, right, middle);
                for (auto k = left; k <= right; ++k)
                        input[k] = output[k];
        }
}

int main()
{
        std::ifstream fin("algsort.in");
        auto n = 0u, input = 0u;
        fin >> n;
        std::vector<uint32_t> values;
        for (auto it = 0; it < n; ++it)
                values.push_back((fin >> input, input));
        fin.close();
        std::vector<uint32_t> temp_values;
        temp_values.resize(n);
        merge_insertion_sort(&values[0], &temp_values[0], 0, n - 1);
        std::ofstream fout("algsort.out");
        for (auto it : values)
                fout << it << " ";
        fout.close();
        return 0;
}