Загрузка данных
#include <iostream> // подключаем библиотеку ввода-вывода (cin, cout)
#include <cstdlib> // подключаем rand(), srand()
#include <ctime> // подключаем time() для инициализации генератора случайных чисел
using namespace std; // используем стандартное пространство имён, чтобы не писать std::
void log_arr(int* arr, int m) { // функция вывода массива на экран
cout << "Sorted Array\n"; // печатаем заголовок
for (int i = 0; i < m; i++) { // проходим по всем элементам массива
cout << arr[i] << ' '; // выводим текущий элемент и пробел
}
cout << endl; // переносим строку после вывода массива
}
void bubbleSort(int* arr, int m) // функция пузырьковой сортировки
{
bool swapped; // флаг: была ли перестановка на текущем проходе
for (int i = 0; i < m - 1; i++) { // внешний цикл — количество проходов по массиву
swapped = false; // в начале прохода считаем, что перестановок не было
for (int j = 0; j < m - i - 1; j++) { // внутренний цикл — сравнение соседних элементов
if (arr[j] > arr[j + 1]) { // если текущий элемент больше следующего
swap(arr[j], arr[j + 1]); // меняем их местами
swapped = true; // отмечаем, что перестановка была
}
}
if (!swapped) break; // если перестановок не было — массив уже отсортирован, выходим
}
}
void shakerSort(int* arr, int m) // функция шейкерной сортировки
{
int left = 0; // левая граница ещё не отсортированной части
int right = m - 1; // правая граница ещё не отсортированной части
while (left < right) // пока границы не сомкнулись
{
for (int i = left; i < right; i++) { // проход слева направо
if (arr[i] > arr[i + 1]) { // если элемент больше соседнего справа
swap(arr[i], arr[i + 1]); // меняем местами (наибольший "всплывает" вправо)
}
}
right--; // сужаем правую границу (там уже стоит максимум)
for (int i = right; i > left; i--) { // проход справа налево
if (arr[i - 1] > arr[i]) { // если левый сосед больше текущего элемента
swap(arr[i], arr[i - 1]); // меняем местами (наименьший "тонет" влево)
}
}
left++; // сужаем левую границу (там уже стоит минимум)
}
}
void quickSort(int* arr, int left, int right) // функция быстрой сортировки (границы диапазона)
{
int i = left; // указатель, идущий слева
int j = right; // указатель, идущий справа
int pivot = arr[(left + right) / 2]; // выбираем опорный элемент (средний по индексу)
while (i <= j) { // пока указатели не пересеклись
while (arr[i] < pivot) i++; // двигаем левый указатель, пока элемент меньше pivot
while (arr[j] > pivot) j--; // двигаем правый указатель, пока элемент больше pivot
if (i <= j) { // если указатели ещё не пересеклись
swap(arr[i], arr[j]); // меняем местами элементы не на своих местах
i++; // сдвигаем левый указатель дальше
j--; // сдвигаем правый указатель дальше
}
}
if (left < j) { // если слева от j есть больше одного элемента
quickSort(arr, left, j); // рекурсивно сортируем левую часть
}
if (i < right) { // если справа от i есть больше одного элемента
quickSort(arr, i, right); // рекурсивно сортируем правую часть
}
}
int main()
{
srand(static_cast<unsigned>(time(0))); // инициализируем генератор случайных чисел текущим временем
int choice; // переменная для выбора пункта меню
int m; // переменная для размера массива
cout << "Select size - "; // просим пользователя ввести размер массива
cin >> m; // считываем размер массива
if (m <= 0) return 0; // если размер некорректный — завершаем программу
int* arr = new int[m]; // выделяем память под массив из m элементов
for (int i = 0; i < m; i++) { // заполняем массив случайными числами
arr[i] = rand() % 133 - 78; // случайное число в диапазоне от -78 до 54
cout << arr[i] << ' '; // выводим сгенерированный элемент
}
cout << endl; // переносим строку после вывода массива
while (true) // главный цикл программы (меню)
{
cout << "\n1. BubbleSort \n2.ShakerSort \n3.QuickSort \n0.Exit\n"; // выводим меню
cin >> choice; // считываем выбор пользователя
switch (choice) // обрабатываем выбор
{
case 1: { bubbleSort(arr, m); log_arr(arr, m); break; } // сортировка пузырьком + вывод
case 2: { shakerSort(arr, m); log_arr(arr, m); break; } // шейкерная сортировка + вывод
case 3: { quickSort(arr, 0, m - 1); log_arr(arr, m); break; } // быстрая сортировка + вывод
case 0: { delete[] arr; exit(0); } // освобождаем память и выходим
default: { cout << "Invalid command\n"; } // некорректный ввод
}
}
}