Pagini recente » Cod sursa (job #122978) | Cod sursa (job #1839263) | Cod sursa (job #925024) | Cod sursa (job #1538831) | Cod sursa (job #2000754)
#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();
auto temp_values = values;
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;
}