Gamerkin

3

Apr 21st, 2023
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.50 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <chrono>
  4.  
  5. using namespace std;
  6. using namespace std::chrono;
  7.  
  8. // Алгоритм шейкерной сортировки
  9. void CocktailSort(int arr[], int n) // Шейкерная сортировка, которая принимает в качестве параметров массива и его размер
  10. {
  11.     bool swapped = true; // Инициализация булевой переменной swapped значением true
  12.     int start = 0; // Инициализация целочисленной переменной start нулём
  13.     int end = n - 1; // Инициализация целочисленной переменной end значением n - 1
  14.  
  15.     while (swapped) { // Пока swapped = true
  16.         // Сброс swapped, так как предыдущая итерация может быть истинной
  17.         swapped = false; // Присвоение переменной swapped значения false
  18.  
  19.         // Цикл слево направо такой же, как пузырьковая сортирвка
  20.         for (int i = start; i < end; ++i) {
  21.             if (arr[i] > arr[i + 1]) {
  22.                 swap(arr[i], arr[i + 1]);
  23.                 swapped = true;
  24.             }
  25.         }
  26.  
  27.         // Если ничего не было перемещено, то массив отсортирован
  28.         if (!swapped)
  29.             break;
  30.  
  31.         // В противном случае сбросить swapped
  32.         swapped = false;
  33.  
  34.         // Переместить конечную точку на единицу назад потому, что элемент в конце находится на правильном месте
  35.         --end;
  36.  
  37.         // Цикл справа налево такой же
  38.         for (int i = end - 1; i >= start; --i) {
  39.             if (arr[i] > arr[i + 1]) {
  40.                 swap(arr[i], arr[i + 1]);
  41.                 swapped = true;
  42.             }
  43.         }
  44.  
  45.         ++start; // Инкрементирование переменной start
  46.     }
  47. }
  48.  
  49. // Быстрая сортировка
  50. void QuickSort(int* arr, int first, int last) // Быстрая сортировка, которая принимает в качестве параметров указатель на массив,
  51. // первого и последнего элемента
  52. {
  53.     int mid, count; // Объявление переменных mid, count
  54.     int f = first, l = last; // Инициализация переменных f и l
  55.     mid = arr[(f + l) / 2]; //вычисление опорного элемента
  56.     do // Начало цикла
  57.     {
  58.         while (arr[f] < mid) f++; // Пока первый элемент меньше опорного инкрементирование f
  59.         while (arr[l] > mid) l--; // Пока последний элемент больше опорного декрементирование l
  60.         if (f <= l) //перестановка элементов
  61.         {
  62.             count = arr[f]; // Присвоение переменной count значения первого элемента
  63.             arr[f] = arr[l]; // Присвоение первому элементу массива значения последнего  элемента
  64.             arr[l] = count; // Присвоение последнему элементу массива значения переменной count
  65.             f++; // Инкрементирование f
  66.             l--; // Декрементирование l
  67.         }
  68.     } while (f < l); // Пока первый элемент меньше последнего
  69.     if (first < l) QuickSort(arr, first, l); // Выполнить рекурсивное упорядочивание левой части нужно в том случае, если выполняется условие L<last.
  70.     // Для правой части условие аналогично: first < R.
  71.     if (f < last) QuickSort(arr, f, last);
  72. }
  73.  
  74.  
  75.  
  76. void Randomazer(int x[], int n) // Рандомайзер, который принимает в качестве параметров массив и его размер
  77. {
  78.     for (int i = 0; i < n; i++) // Цикл по переменно i в диапазоне от 0 до n не включительно
  79.     {
  80.         x[i] = rand() % 10; // Заполненние массива случайными числами до 10
  81.     }
  82. }
  83.  
  84. void Print(int x[], int n) // Функция, выводящая массив на экран, которая принимает в качестве параметров массив и его размер
  85. {
  86.     for (int i = 0; i < n; ++i) // Цикл по переменно i в диапазоне от 0 до n не включительно
  87.     {
  88.         cout << x[i] << " "; // Вывод i-го элемента и пробела
  89.     }
  90.     cout << endl; // Перевод строки
  91. }
  92.  
  93. int main() // Основной алгоритм
  94. {
  95.     setlocale(0, ""); // Установка русского языка в консоле
  96.     int n; // Объявление переменной n
  97.  
  98.     cout << "Размер массива: 10 или 100?" << endl; // Вывод сообщения "Размер массива: 10 или 100?" с переводом строки
  99.     cin >> n; // Ввод значения переменной n с клавиатуры
  100.     int fisrt = 0, last = n - 1; // Инициализация переменных fisrt и last
  101.     auto* x = new int[n]; // Создание целочисленного динамического массива размера n
  102.  
  103.     //Randomazer(x, n); // Вызов функции Randomazer с параметрами x и n
  104.  
  105.     for (int i = 0; i < n; i++) // Цикл по переменно i в диапазоне от 0 до n не включительно
  106.     {
  107.         int el; // Объявление переменной el
  108.         cout << "Введите элемент #" << i + 1 << ": "; cin >> el; // Вывод сообщения "Введите элемент #" i + 1 и ввод значения переменной el с клавиатуры
  109.         x[i] = el; // Присвоение i-му элементу массива значения el
  110.     }
  111.  
  112.     cout << "Ваш массив" << endl; // Вывод сообщения "Ваш массив" с переводом строки
  113.     Print(x, n); // Вызов функции Print с параметрами x и n
  114.  
  115.     auto start = high_resolution_clock::now();
  116.  
  117.     //CocktailSort(x, n); // Вызов функции CocktailSort с параметрами x и n
  118.     QuickSort(x, fisrt, last); // Вызов функции QuickSort с параметрами x, fisrt и last
  119.  
  120.     auto stop = high_resolution_clock::now();
  121.     auto duration = duration_cast<milliseconds>(stop - start);
  122.     cout << "Время выполнения: " << duration.count() << " milliseconds" << endl;
  123.  
  124.     cout << "Отсортированный массив" << endl; // Вывод сообщения "Очищенный массив" с переводом строки
  125.     Print(x, n); // Вызов функции Print с параметрами x и n
  126.  
  127.     delete[]x; // Удаление массива x
  128.  
  129.     system("pause"); // Пауза для просмотра результата
  130.     return 0; // Возврат нуля - индикатор корректности завершения программы
  131. }
  132.  
Add Comment
Please, Sign In to add comment