Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime> // Для того, чтобы засечь время
  3. #include <algorithm> // Для swap
  4. using namespace std;
  5.  
  6. const int arr_size = 10000; // Размер массивов
  7.  
  8. void Cocktail(long int* arr);
  9. void Shell(long int* arr);
  10. void Merge(long int* arr, int s, int f); // s - позиция первого элемента, f - последнего
  11.  
  12. int main()
  13. {
  14.     setlocale(0, "");
  15.     srand(time(0));
  16.  
  17.     long int* first_arr = new long int[arr_size];
  18.     long int* second_arr = new long int[arr_size];
  19.     long int* third_arr = new long int[arr_size];
  20.  
  21.     // Создаем один уникальный массив и копируем его
  22.     for (int i = 0; i < arr_size; i++)
  23.     {
  24.         first_arr[i] = rand() * rand() / 10;
  25.         second_arr[i] = first_arr[i];
  26.         third_arr[i] = first_arr[i];
  27.     }
  28.  
  29.     // Шейкерная
  30.     double clock_start = clock() / 1000.0;
  31.     Cocktail(first_arr);
  32.     double clock_end = clock() / 1000.0;
  33.     cout << "Время работы шейкерной сортировки с " << arr_size << " - " << clock_end - clock_start << " сек." << endl;
  34.  
  35.     // Шелла
  36.     clock_start = clock() / 1000.0;
  37.     Shell(second_arr);
  38.     clock_end = clock() / 1000.0;
  39.     cout << "Время работы сортировки Шелла с " << arr_size << " - " << clock_end - clock_start << " сек." << endl;
  40.  
  41.     // Слиянием
  42.     clock_start = clock() / 1000.0;
  43.     Merge(third_arr, 0, arr_size - 1);
  44.     clock_end = clock() / 1000.0;
  45.     cout << "Время работы сортировки слиянием с " << arr_size << " - " << clock_end - clock_start << " сек." << endl;
  46.  
  47.     delete[] first_arr;
  48.     delete[] second_arr;
  49.     delete[] third_arr;
  50.     return 0;
  51. }
  52.  
  53.  
  54. void Cocktail(long int* arr)
  55. {
  56.     int leftMark = 1;
  57.     int rightMark = arr_size - 1;
  58.     while (leftMark <= rightMark)
  59.     {
  60.         for (int i = rightMark; i >= leftMark; i--)
  61.             if (arr[i - 1] > arr[i])
  62.                 swap(arr[i], arr[i-1]);
  63.         leftMark++;
  64.  
  65.         for (int i = leftMark; i <= rightMark; i++)
  66.             if (arr[i - 1] > arr[i])
  67.                 swap(arr[i], arr[i-1]);
  68.         rightMark--;
  69.     }
  70. }
  71.  
  72. void Shell(long int* arr)
  73. {
  74.     int i, j, step;
  75.     int tmp;
  76.     for (step = arr_size / 2; step > 0; step /= 2)
  77.         for (i = step; i < arr_size; i++)
  78.         {
  79.             tmp = arr[i];
  80.             for (j = i; j >= step; j -= step)
  81.             {
  82.                 if (tmp < arr[j - step])
  83.                     arr[j] = arr[j - step];
  84.                 else
  85.                     break;
  86.             }
  87.             arr[j] = tmp;
  88.         }
  89. }
  90.  
  91. void Merge(long int* arr, int s, int f)
  92. {
  93.     if (f == s)
  94.         return;
  95.     if (f - s == 1) {
  96.         if (arr[f] < arr[s])
  97.             swap(arr[f], arr[s]);
  98.         return;
  99.     }
  100.  
  101.     int m = (f + s) / 2;
  102.     Merge(arr, s, m);
  103.     Merge(arr, m + 1, f);
  104.  
  105.     long int* buf = new long int[arr_size];
  106.     int xs = s;
  107.     int xf = m + 1;
  108.     int cur = 0;
  109.  
  110.     while (f - s + 1 != cur) {
  111.         if (xs > m)
  112.             buf[cur++] = arr[xf++];
  113.         else if (xf > f)
  114.             buf[cur++] = arr[xs++];
  115.         else if (arr[xs] > arr[xf])
  116.             buf[cur++] = arr[xf++];
  117.         else buf[cur++] = arr[xs++];
  118.  
  119.     }
  120.     for (int i = 0; i < cur; i++)
  121.         arr[i + s] = buf[i];
  122.  
  123.     delete[] buf;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement