mirror of
https://github.com/koloideal/SortLab.git
synced 2026-06-10 10:25:30 +03:00
191 lines
7.4 KiB
Markdown
191 lines
7.4 KiB
Markdown
# 🎯 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
|
||
```
|
||
|
||
---
|
||
|
||
<div align="center">
|
||
<sub>🎓 made for college coursework | built with ❤️ and C++17</sub>
|
||
</div>
|