Загрузка данных
Мой косяк, переборщил с метафорами. Возвращаемся к технической точности, но меняем формулировки, чтобы текст читался легче исходника.
## ШАПКА
* Q: Что делает #include <iostream>?
* A: Подключает стандартный заголовочный файл для работы с потоками ввода-вывода, открывая возможность использовать объекты std::cin и std::cout.
* Q: Что делает using namespace std;?
* A: Импортирует всё содержимое пространства имен std в текущую область видимости, избавляя от необходимости прописывать std:: перед cout, cin, swap и другими стандартными компонентами.
------------------------------
## ФУНКЦИЯ log_arr
* Q: Что означают параметры int* arr и int m?
* A: arr — это указатель, хранящий адрес первой ячейки массива в памяти. Переменная m передается следом, так как сам указатель не содержит информацию о длине выделенной памяти, и функции нужно знать, где остановиться.
* Q: Что делает строка cout << "Sortet Array\n";?
* A: Выводит в консоль текстовую строку-индикатор, оповещающую пользователя о начале вывода отсортированных данных.
* Q: Что делает цикл for(int i = 0; i < m; i++) { cout << arr[i] << ' '; }?
* A: Итерируется по элементам массива с индексами от 0 до m-1, последовательно отправляя их значения в поток вывода через пробел.
------------------------------
## ФУНКЦИЯ bubbleSort
* Q: Зачем два вложенных цикла?
* A: Внутренний цикл отвечает за один одиночный проход по элементам и перемещение одной максимальной величины в конец рабочей зоны. Внешний цикл повторяет этот процесс m раз, обеспечивая полную сортировку всех элементов.
* Q: Что делает конструкция со swap?
* A: Проверяет упорядоченность соседней пары. Если текущий элемент оказывается больше последующего, они меняются местами. За счет этого крупные значения последовательно сдвигаются в правый край массива.
------------------------------
## ФУНКЦИЯ shakerSort
* Q: Что означают переменные left и right?
* A: Это индексы-маркеры, фиксирующие границы подмассива, который еще предстоит отсортировать (первоначально от 0 до m-1).
* Q: Что делает условие while (left < right)?
* A: Поддерживает выполнение алгоритма до тех пор, пока левая граница не встретится с правой, что сигнализирует об окончании сортировки.
* Q: Что происходит в части с right--?
* A: Выполняется прогон слева направо для перемещения наибольшего значения в конец, после чего правый маркер сдвигается влево (right--), так как крайняя правая позиция уже занята верным элементом.
* Q: Что делает часть с left++?
* A: Выполняется обратный прогон справа налево для смещения наименьшего значения в начало, после чего левый маркер сдвигается вправо (left++), исключая уже отсортированную первую ячейку.
------------------------------
## ФУНКЦИЯ quickSort
* Q: Что означают left, right, i, j?
* A: left и right задают диапазон текущего сегмента массива. i и j выступают в роли подвижных индексов, которые сканируют этот сегмент, двигаясь навстречу друг другу.
* Q: Что такое pivot?
* A: Опорный элемент, значение которого берется из середины текущего диапазона для последующего сравнения и разделения массива на две группы.
* Q: Что делает внутренний цикл с i++?
* A: Сдвигает левый индекс вправо, пока не наткнется на элемент, нарушающий правило сортировки (значение которого больше либо равно pivot).
* Q: Что делает цикл с j--?
* A: Сдвигает правый индекс влево, пока не обнаружит элемент, который меньше либо равен pivot.
* Q: Что происходит при if(i <= j)?
* A: Если индексы i и j еще не разошлись, найденные элементы-нарушители меняются местами через swap, после чего оба индекса делают шаг к центру для продолжения проверки.
* Q: Зачем эти два рекурсивных вызова?
* A: Позволяют применить тот же алгоритм быстрой сортировки отдельно к левой (содержащей меньшие элементы) и правой (содержащей большие элементы) частям, на которые разделился массив.
------------------------------
## ФУНКЦИЯ main
* Q: Что делает строка int arr2 [6];?
* A: Резервирует память на стеке под массив из 6 целочисленных значений. Данные в ячейках не инициализированы и содержат случайный системный мусор.
* Q: Что делает строка srand(time(0));?
* A: Передает текущее системное время в качестве начального значения (seed) для генератора псевдослучайных чисел, гарантируя уникальность генерируемых чисел при каждом старте.
* Q: Что делают строки с cin >> m?
* A: Запрашивают ввод у пользователя через консоль и сохраняют полученное число в переменную m, определяя будущий размер динамического массива.
* Q: Что означают переменные left и right в main?
* A: Задают стартовые индексы краев всего массива (0 для начала и m-1 для конца), которые потребуются для инициализации первой итерации quickSort.
* Q: Что делает строка int* arr = new int[m];?
* A: Динамически выделяет непрерывный блок памяти в куче (heap) под m переменных типа int и записывает адрес этой области в указатель arr.
* Q: Что делает строка int** arr1 = new int*[m];? Чем она отличается от int*?
* A: int* хранит адрес на массив обычных чисел, а int** выделяет память под массив указателей. Это промежуточный шаг, который обычно применяется для создания динамических матриц (двумерных массивов).
* Q: Что делает строка arr[i] = rand() % 55 - 78;?
* A: Ограничивает случайное число остатком от деления на 55 (диапазон 0..54), сдвигает его вычитанием 78 в диапазон от -78 до -24, записывает в i-ю ячейку и выводит на экран.
* Q: Что делает строка while (true)?
* A: Создает бесконечный цикл обработки, чтобы пользователь мог многократно выбирать разные виды сортировок в меню без перезапуска программы.
* Q: Что делают строки с cin >> n?
* A: Отображают список доступных опций программы и считывают код выбранной команды в переменную n.
* Q: Что делает case 1?
* A: При выборе единицы передает управление функции bubbleSort, затем обновляет экран с помощью log_arr и через break прерывает выполнение switch, возвращаясь в цикл меню.
* Q: Что делает case 2?
* A: Аналогично обрабатывает двойку, запуская для массива алгоритм шейкерной сортировки.
* Q: Что делает case 3?
* A: Реализует вызов quickSort, передавая туда массив и его полные границы от left до right, после чего выводит результат.
* Q: Что делает exit(0)?
* A: Вызывает системную функцию немедленного завершения процесса с кодом 0, сигнализирующим об успешном закрытии приложения.
* Q: Когда срабатывает default?
* A: Выполняется в случае, если введенное значение n не соответствует ни одному из предусмотренных пунктов меню, выводя предупреждение о некорректном вводе.