ProgMe

Untitled

Dec 26th, 2023
1,073
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. // IN-PLACE MERGE SORT
  5.  
  6. void merge(std::vector<int>& arr, size_t left, size_t mid, size_t right) {
  7.     // индекс начала второй "половины" для слияния
  8.     size_t left_2 = mid + 1;
  9.  
  10.     // половины уже отсортированы
  11.     if (arr[mid] <= arr[left_2]) return;
  12.  
  13.     while (left <= mid && left_2 <= right) {
  14.         // первые элементы в правильном порядке
  15.         if (arr[left] <= arr[left_2]) left++;
  16.         else {
  17.             // вставляем на правильное место left элемент arr[left_2]
  18.             // запоминаем его и его индекс
  19.             int value = arr[left_2];
  20.             size_t ind = left_2;
  21.  
  22.             // сдвигаем все элементы между left и left_2 вправо
  23.             // и записываем на место left элемент arr[left_2]
  24.             while (ind != left) {
  25.                 arr[ind] = arr[ind - 1];
  26.                 ind--;
  27.             }
  28.             arr[left] = value;
  29.            
  30.             // передвигаем все рабочие индексы
  31.             left++;
  32.             mid++;
  33.             left_2++;
  34.         }
  35.     }
  36. }
  37.  
  38. // основной метод сортировки
  39. void mergeSort(std::vector<int>& arr, size_t left, size_t right) {
  40.     if (left < right) {
  41.         size_t mid = left + (right - left) / 2;
  42.  
  43.         mergeSort(arr, left, mid);
  44.         mergeSort(arr, mid + 1, right);
  45.  
  46.         merge(arr, left, mid, right);
  47.     }
  48. }
  49.  
  50. int main() {
  51.     std::vector<int> v {-1, -2, 5, 6, 6, 7, 7, 8, -9, -100};
  52.  
  53.     mergeSort(v, 0, v.size() - 1);
  54.  
  55.     for (int elem : v) {
  56.         std::cout << elem << " ";
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment