TO SEE ENGLISH VERSION OF THIS GUIDE, CLICK HERE
Чтобы увидеть код, нажмите здесь
Для начала вам нужно склонировать репозиторий на ваш локальный компьютер. Это можно сделать с помощью команды git clone
, указав URL репозитория. Например:
git clone https://github.com/UrranQx/lab6.git
Проект написан на языке C++, поэтому вам понадобится компилятор C++. Также проект использует систему сборки CMake, поэтому вам потребуется установить CMake.
Убедитесь, что находитесь в корневой директории проекта.(pwd
-> ...\lab6
). Затем создайте директорию build
и
Если нет желания устанавливать cmake, а есть нужна скомпилить самому, то можно воспользоваться командой g++
:
g++ main.cpp -o ./lab6
Если вы установили cmake, то перейдите в директорию build
и выполните команды cmake
и make
для сборки проекта. Например:
Введённые команды будут выглядеть так:
mkdir build
cd build
cmake ..
make
После сборки проекта в директории build
появится исполняемый файл lab6
. Находясь в директории build
запустите его, чтобы увидеть результаты сортировки. Например:
./lab6
Этот проект представляет собой комплексную реализацию различных алгоритмов сортировки на C++. Код написан таким образом, что позволяет легко сравнивать производительность различных алгоритмов сортировки. Реализованные алгоритмы сортировки включают пузырьковую сортировку Bubble Sort
, сортировку выбором Selection Sort
, сортировку вставками Insertion Sort
, сортировку Шелла Shell Sort
и быструю сортировку Quick Sort
.
Код организован вокруг функции main
и функции sub_main
. Функция main отвечает за получение от пользователя входных данных для размера матрицы и функции-компаратора, которая будет использоваться для сортировки. Функция sub_main - это место, где происходит непосредственная сортировка.
В коде также есть ряд вспомогательных функций для сортировки и работы с матрицей. Сюда входят функции для копирования и удаления матриц, поиска индекса максимального и минимального элементов в массиве, а также различные функции-компараторы для разных порядков сортировки.
Каждый алгоритм сортировки реализован как отдельная функция, которая принимает массив, его размер, функцию-компаратор и ссылки на переменные для отслеживания количества перестановок (далее свапов) и сравнений, сделанных во время сортировки.
Алгоритмы сортировки расположены в массиве для удобства. Это позволяет легко перебирать все алгоритмы сортировки, применяя их к одним и тем же данным и сравнивая их производительность.
Тип данных Comparator
объявлен для удобства работы с функциями сравнения. Comparator
- это указатель на функцию, которая принимает два аргумента и возвращает bool
. Это позволяет использовать различные функции сравнения в алгоритмах сортировки, меняя порядок сортировки. Переменная debug
используется для контроля вывода информации во время выполнения программы. В зависимости от значения debug
, программа может выводить больше или меньше информации о своем выполнении. Это может быть полезно при отладке или при анализе производительности алгоритмов сортировки.
В коде есть функциональность для сравнения производительности различных алгоритмов сортировки. Это делается путем отслеживания количества обменов и сравнений, сделанных во время сортировки. Результаты затем выводятся в таблицу для удобства сравнения.
Чтобы использовать код, просто запустите функцию main и следуйте подсказкам для ввода размера матрицы и функции-компаратора, которая будет использоваться для сортировки. Код затем отсортирует матрицу с использованием каждого из реализованных алгоритмов сортировки и выведет результаты.
Код использует ANSI цветовые коды для более удобного чтения вывода. Также используется функция std::setw
для выравнивания вывода в аккуратную таблицу. Код динамически выделяет и освобождает память для матрицы и массивов, используемых для отслеживания количества обменов и сравнений.
В коде также есть функция amountOfDigits
для вычисления количества цифр в числе, которая используется для определения ширины столбцов в таблице вывода.
Код использует функцию free
для освобождения памяти, выделенной с помощью malloc
, и оператор delete
для освобождения памяти, выделенной с помощью new
.
В коде есть две разных реализации selectionSort
. Одна из них selectionSort_orderFinder
напрямую показывает принцип работы через введенную доп. функцию findIndexOfBestInOrder
и иногда на малых значениях она делает меньше перестановок, но на больших данных все равно проигрывает в производительности. Вторая реализация selectionSort
реализует незаурядный способ нахождения индекса нужного для свапа элемента. Их работа практически идентична, но как по мне, принцип действия первой реализации концептуально более понятный.
В коде есть комментарий в конце с инструкциями по созданию и удалению матрицы с использованием динамического выделения памяти в C++.