diff --git a/CMakeLists.txt b/CMakeLists.txt index fd8b3fd..a93d126 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,27 +9,46 @@ FetchContent_Declare( SFML GIT_REPOSITORY https://github.com/SFML/SFML.git GIT_TAG 2.6.x - GIT_SHALLOW ON - EXCLUDE_FROM_ALL - SYSTEM + GIT_SHALLOW ON + EXCLUDE_FROM_ALL + SYSTEM ) FetchContent_MakeAvailable(SFML) -add_executable(SortLab - src/main.cpp - src/App.cpp - src/App_audio.cpp - src/Array.cpp - src/Sorter.cpp - src/UI.cpp - src/OperationsHistory.cpp - src/ProgressMap.cpp - src/sorters/BubbleSorter.cpp - src/sorters/SelectionSorter.cpp - src/sorters/InsertionSorter.cpp - src/sorters/MergeSorter.cpp - src/sorters/QuickSorter.cpp -) +if(WIN32) + add_executable(SortLab + src/main.cpp + src/App.cpp + src/App_audio.cpp + src/Array.cpp + src/Sorter.cpp + src/UI.cpp + src/OperationsHistory.cpp + src/ProgressMap.cpp + src/sorters/BubbleSorter.cpp + src/sorters/SelectionSorter.cpp + src/sorters/InsertionSorter.cpp + src/sorters/MergeSorter.cpp + src/sorters/QuickSorter.cpp + assets/app.rc + ) +else() + add_executable(SortLab + src/main.cpp + src/App.cpp + src/App_audio.cpp + src/Array.cpp + src/Sorter.cpp + src/UI.cpp + src/OperationsHistory.cpp + src/ProgressMap.cpp + src/sorters/BubbleSorter.cpp + src/sorters/SelectionSorter.cpp + src/sorters/InsertionSorter.cpp + src/sorters/MergeSorter.cpp + src/sorters/QuickSorter.cpp + ) +endif() if(MSVC) target_compile_options(SortLab PRIVATE /utf-8) @@ -39,7 +58,6 @@ target_include_directories(SortLab PRIVATE ${CMAKE_SOURCE_DIR}/include) target_link_libraries(SortLab PRIVATE sfml-graphics sfml-window sfml-system sfml-audio) - if(WIN32) add_custom_command(TARGET SortLab POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different diff --git a/README.md b/README.md index e69de29..cacbe95 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,190 @@ +# 🎯 SortLab + +### ⚡ Интерактивный визуализатор алгоритмов сортировки + + + + + + + +--- + + + +--- + +## 📖 О проекте + +**SortLab** — учебный инструмент для наглядного изучения алгоритмов сортировки. +Каждый элемент массива отображается как столбик. Высота = значение. Цвет = состояние. + +Программа показывает работу алгоритма в реальном времени, шаг за шагом, с подсветкой +сравниваемых и переставляемых элементов, счётчиком операций и визуализацией прогресса. + +--- + +## 🧮 Алгоритмы + +| # | Алгоритм | Время (лучшее / среднее / худшее) | Память | +|---|---|---|---| +| `1` | 🫧 Bubble Sort | O(n) / O(n²) / O(n²) | O(1) | +| `2` | 🔍 Selection Sort | O(n²) / O(n²) / O(n²) | O(1) | +| `3` | 🃏 Insertion Sort | O(n) / O(n²) / O(n²) | O(1) | +| `4` | 🔀 Merge Sort | O(n log n) / O(n log n) / O(n log n) | O(n) | +| `5` | ⚡ Quick Sort | O(n log n) / O(n log n) / O(n²) | O(log n) | + +--- + +## 🎮 Управление + +| Клавиша | Действие | +|---|---| +| `Space` | ▶️ Старт / ⏸️ Пауза | +| `R` | 🔀 Перемешать массив | +| `→` | 👣 Один шаг (в режиме паузы) | +| `↑` / `↓` | 🐇 / 🐢 Увеличить / уменьшить скорость | +| `1` — `5` | 🔢 Выбрать алгоритм | +| `I` | ℹ️ Справка о программе | +| `Q` | 🚪 Выход | + +--- + +## 🖥️ Интерфейс + +``` +┌──────────────────────────────────────────────────────────────┐ +│ 📊 Algorithm: Quick Sort Time: O(n log n) Comparisons: 1.2k │ ← UI панель +├────────────────────────────────────┬─────────────────────────┤ +│ │ │ +│ 📈 Столбики массива │ 🗺️ Progress Map │ +│ │ │ +├────────────────────────────────────┴─────────────────────────┤ +│ 📉 Δ Comparisons / step [гистограмма] │ ← нижняя панель +└──────────────────────────────────────────────────────────────┘ +``` + +- 📊 **Главная область** — столбики с цветовой индикацией состояний +- 🗺️ **Progress Map** — миниатюрная сетка всего массива, зеленеет по мере сортировки +- 📉 **Δ Гистограмма** — количество сравнений на каждом шаге (пульс алгоритма) + +### 🎨 Цветовая схема + +| Цвет | Состояние | +|---|---| +| 🔵 Синий | Обычный элемент | +| 🩵 Голубой | Сравниваемые элементы | +| 🟠 Оранжевый | Переставляемые элементы | +| 🟢 Зелёный | Отсортированный элемент | + +--- + +## 🔧 Сборка + +### 📦 Зависимости +- 🛠️ [CMake](https://cmake.org/download/) ≥ 3.16 +- 💻 [Visual Studio 2022](https://visualstudio.microsoft.com/) с компонентом **Desktop development with C++** +- 🌐 Git (для FetchContent — SFML скачивается автоматически) + +### 🚀 Установка + +```bash +git clone https://github.com/your-username/SortLab.git +cd SortLab +cmake -S . -B build +cmake --build build --config Release +.\build\Release\SortLab.exe +``` + +> 💡 SFML 2.6 скачивается и компилируется автоматически при первой сборке. +> ⏱️ Первый запуск `cmake -S . -B build` займёт 1–3 минуты. + +### 🔤 Шрифт +Скачай [JetBrains Mono](https://www.jetbrains.com/lp/mono/) и положи файл в: +``` +assets/fonts/JetBrainsMono-Regular.ttf +``` + +--- + +## 📁 Структура проекта + +``` +SortLab/ +├── 🎨 assets/ +│ ├── fonts/JetBrainsMono-Regular.ttf +│ ├── icon.ico +│ ├── icon.png +│ ├── preview.png +│ └── app.rc +├── 📋 include/ +│ ├── App.hpp +│ ├── Array.hpp +│ ├── Sorter.hpp +│ ├── UI.hpp +│ ├── OperationsHistory.hpp +│ ├── ProgressMap.hpp +│ └── sorters/ +│ ├── BubbleSorter.hpp +│ ├── SelectionSorter.hpp +│ ├── InsertionSorter.hpp +│ ├── MergeSorter.hpp +│ └── QuickSorter.hpp +├── 💻 src/ +│ ├── main.cpp +│ ├── App.cpp +│ ├── App_audio.cpp +│ ├── Array.cpp +│ ├── Sorter.cpp +│ ├── UI.cpp +│ ├── OperationsHistory.cpp +│ ├── ProgressMap.cpp +│ └── sorters/ +│ ├── BubbleSorter.cpp +│ ├── SelectionSorter.cpp +│ ├── InsertionSorter.cpp +│ ├── MergeSorter.cpp +│ └── QuickSorter.cpp +└── ⚙️ CMakeLists.txt +``` + +--- + +## 🏗️ Архитектура + +``` +main() + └── App::run() + ├── handleEvents() — ввод с клавиатуры + ├── update(dt) — шаг сортировки + гистограмма + └── render() + ├── Array bars — основная визуализация + ├── UI overlay — текст, статистика + ├── ProgressMap — мини-карта + └── HistogramRenderer — Δ гистограмма + +Sorter (abstract) + ├── BubbleSorter + ├── SelectionSorter + ├── InsertionSorter + ├── MergeSorter + └── QuickSorter +``` + +> 🔑 Ключевой паттерн: все алгоритмы реализованы как **конечные автоматы** (state machines). +> Метод `step()` выполняет ровно одну атомарную операцию и возвращает управление, +> не блокируя главный поток рендеринга. + +--- + +## 📜 Лицензия + +``` +MIT License — 2026 +``` + +--- + +