Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
З лабораторної роботи №5
з дисципліни: «Алгоритми та моделі обчислень»
на тему:
«функційне програмування.»
Львів 2022
Мета роботи: ознайомитися з парадигмою функційного програмування.
Завдання
Детально ознайомитися з наведеним прикладом програми та здійснити за її допомогою сортування вхідних даних згідно варіанту.
/
Код програми
#include <iostream>
#include <iterator>
#include <list>
#include <future>
#include <stack>
#include <thread>
#include <vector>
#include <algorithm>
#define DATA_TYPE unsigned long long int
#define INPUT_DATA {585, 586, 581, 581, 577, 580, 581, 576, 576, 572, 579, 571, 576, 577, 572, 574, 566, 571, 572, 567}
template<typename F, typename A>
std::future<typename std::result_of<F(A&&)>::type>
spawn_task(F&& f, A&& a) {
typedef std::result_of<F(A&&)> result_type;
std::packaged_task<result_type(A&&)> task(std::move(f));
std::future<result_type> res(task.get_future());
std::thread t(std::move(task), std::move(a));
t.detach();
return res;
}
template < typename T >
std::list < T > sequential_quick_sort(std::list<T> input) {
if (input.empty()) {
return input;
}
std::list<T> result;
result.splice(result.begin(), input, input.begin()); // (1)
T const& pivot = *result.begin(); // (2)
auto divide_point = std::partition(input.begin(), input.end(), [&](T const& t) {return t < pivot; }); //(3)
std::list<T> lower_part;
lower_part.splice(lower_part.end(), input, input.begin(), divide_point); // (4)
auto new_lower(sequential_quick_sort(std::move(lower_part))); // (5)
auto new_higher(sequential_quick_sort(std::move(input))); // (6)
result.splice(result.end(), new_higher); // (7)
result.splice(result.begin(), new_lower); // (8)
return result;
}
template < typename T >
std::list < T > parallel_quick_sort(std::list<T> input) {
if (input.empty()) {
return input;
}
std::list<T> result;
result.splice(result.begin(), input, input.begin());
T const& pivot = *result.begin();
auto divide_point = std::partition(input.begin(), input.end(), [&](T const& t) {return t < pivot; });
std::list<T> lower_part;
lower_part.splice(lower_part.end(), input, input.begin(), divide_point);
std::future<std::list<T> > new_lower(std::async(¶llel_quick_sort<T>, std::move(lower_part))); // (1)
auto new_higher(parallel_quick_sort(std::move(input))); // (2)
result.splice(result.end(), new_higher); // (3)
result.splice(result.begin(), new_lower.get()); // (4)
return result;
}
int main()
{
std::list<DATA_TYPE> input(INPUT_DATA);
std::list<DATA_TYPE> output = sequential_quick_sort(input);
std::cout << "input:" << std::endl;
std::copy(input.begin(), input.end(), std::ostream_iterator<DATA_TYPE>(std::cout, ", "));
std::cout << std::endl << std::endl;
std::cout << "output:" << std::endl;
std::copy(output.begin(), output.end(), std::ostream_iterator<DATA_TYPE>(std::cout, ", "));
std::cout << std::endl << std::endl;
std::cout << "Press Enter to continue . . .";
std::cin.get();
return 0;
}
Результат виконання
/
Висновок: виконавши дану лабораторну роботу, я ознайомився з парадигмою функційного програмування. Виконала швидке сортування для заданного масиву.