Advertisement
Proff_Ust

MergeSort_commented

Nov 17th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. int Min(int a, int b)//функция вернет минимальное число из a и b
  7. {
  8.     if(a<b)
  9.         return a;
  10.     else
  11.         return b;
  12. }
  13.  
  14. int* Cpy(int* B, int* Arr, int left, int right, int& k)//функция копирует хвост одного массива в другой начиная с позиции left и заканчивая позицией right
  15. {
  16.     for (int i = left; i <= right; i++)
  17.     {
  18.         B[k] = Arr[i];
  19.         k++;
  20.     }
  21.     return B;
  22. }
  23.  
  24. void MergeSort(int*Arr, int kn, int deg)//алгоритм сортировки слиянием массива Arr длиной kn кусочками по deg
  25. {
  26.     int* B = new int[kn];
  27.     int i = 0, j = deg;
  28.     int k = 0;
  29.     int p = j;
  30.     int q = Min(kn - j, p);
  31.     int l = 0, r = 0;
  32.  
  33.  
  34.     while (j < kn)
  35.     {
  36.         l = r + p;
  37.         r = l + q;
  38.         while (i < l && j < r)
  39.         {
  40.             if (Arr[i] < Arr[j])
  41.             {
  42.                 B[k] = Arr[i];
  43.                 i++;
  44.             }
  45.             else
  46.             {
  47.                 B[k] = Arr[j];
  48.                 j++;
  49.             }
  50.             k++;
  51.  
  52.         }
  53.         if (i == l)
  54.             B = Cpy(B, Arr, j, r - 1, k);
  55.         else if (j==r)
  56.             B = Cpy(B, Arr, i, l - 1, k);
  57.         i = r;
  58.         j = r + p;
  59.         q = Min(kn - j, p);
  60.     }
  61.  
  62.  
  63.  
  64.     if (i < kn)
  65.         B = Cpy(B, Arr, i, kn - 1, k);
  66.     for (int i = 0; i < kn; i++)
  67.         Arr[i] = B[i];
  68.     delete[]B;
  69. }
  70.  
  71. int* Merge(int* B, int n, int size)//задание - сортировка массива B слиянием.
  72. {
  73.     for (int i = n; i < size; i += n)
  74.         MergeSort(B, size, i);
  75.  
  76.     return B;
  77. }
  78.  
  79. int main()
  80. {
  81.     setlocale(0, "");
  82.     int k, n;
  83.     cout << "Введите количество отсортированных последовательностей: " << endl;
  84.     cin >> k;
  85.     cout << "Введите длину отсортированных последовательностей: " << endl;
  86.     cin >> n;
  87.  
  88.     int** arr = new int*[k];//выделения памяти для матрицы в k строк, каждая из которых по
  89.     for (int i = 0; i < k; i++)
  90.         arr[i] = new int[n];//n элементов
  91.  
  92.     for (int i = 0; i < k; i++)
  93.     {
  94.         cout << "Введите последовательность № " << i+1 << endl;
  95.         for (int j = 0; j < n; j++)
  96.             cin >> arr[i][j];//ввод последовательностей
  97.     }
  98.     int starttime = clock();//запоминаем время начала алгоритма
  99.     int* B = new int[n*k];//создаем массив длинной k*n элементов
  100.  
  101.     for (int i = 0; i < k; i++)
  102.         for (int j = 0; j < n; j++)
  103.             B[i*n+j] = arr[i][j];
  104.  
  105.     cout << endl << "Исходный массив NK: " << endl;
  106.     for (int i = 0; i < n*k; i++)
  107.         cout << B[i] << ' ';
  108.     cout << endl << endl;
  109.  
  110.     B = Merge(B, n, n*k);
  111.  
  112.     int dlitelnost = clock() - starttime;
  113.     cout << "Время выполенения алгоритма " <<dlitelnost<<" миллисекунд"<<endl;
  114.     //cout << "Желаемое время выполнения " <<n*log(n)<<" миллисекунд"<<endl;
  115.     cout << "Получившийся массив NK: " << endl;
  116.     for (int i = 0; i < n*k; i++)
  117.         cout << B[i] << ' ';
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement