shizaero

Untitled

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