Advertisement
RobertDeMilo

Merge sort (Тема 20/24: Итераторы → Урок 8/10)

Apr 19th, 2024
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <vector>
  5. #include <random>
  6.  
  7. using namespace std;
  8.  
  9. template <typename It>
  10. void PrintRange(It range_begin, It range_end) {
  11.     for (auto it = range_begin; it != range_end; ++it) {
  12.         cout << *it << " "s;
  13.     }
  14.     cout << endl;
  15. }
  16.  
  17. template <typename RandomIt>
  18. void MergeSort(RandomIt range_begin, RandomIt range_end) {
  19.     // 1. Если диапазон содержит меньше 2 элементов, выходим из функции
  20.     int range_length = range_end - range_begin;
  21.     if (range_length < 2) {
  22.         return;
  23.     }
  24.  
  25.     // 2. Создаем вектор, содержащий все элементы текущего диапазона
  26.     vector<typename RandomIt::value_type> elements(range_begin, range_end);
  27.  
  28.     // 3. Разбиваем вектор на две равные части
  29.     auto mid = elements.begin() + range_length / 2;
  30.  
  31.     // 4. Вызываем функцию MergeSort от каждой половины вектора
  32.     MergeSort(elements.begin(), mid);
  33.     MergeSort(mid, elements.end());
  34.  
  35.     // 5. С помощью алгоритма merge сливаем отсортированные половины
  36.     // в исходный диапазон
  37.     // merge -> http://ru.cppreference.com/w/cpp/algorithm/merge
  38.     merge(elements.begin(), mid, mid, elements.end(), range_begin);
  39. }
  40.  
  41. int main() {
  42.     vector<int> test_vector(10);
  43.  
  44.     // iota             -> http://ru.cppreference.com/w/cpp/algorithm/iota
  45.     // Заполняет диапазон последовательно возрастающими значениями
  46.     iota(test_vector.begin(), test_vector.end(), 1);
  47.  
  48.     // shuffle   -> https://ru.cppreference.com/w/cpp/algorithm/random_shuffle
  49.     // Перемешивает элементы в случайном порядке
  50.     random_device rd;
  51.     mt19937 g(rd());
  52.     shuffle(test_vector.begin(), test_vector.end(), g);
  53.  
  54.     // Выводим вектор до сортировки
  55.     PrintRange(test_vector.begin(), test_vector.end());
  56.  
  57.     // Сортируем вектор с помощью сортировки слиянием
  58.     MergeSort(test_vector.begin(), test_vector.end());
  59.  
  60.     // Выводим результат
  61.     PrintRange(test_vector.begin(), test_vector.end());
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement