Консольная программа на Java 21: пошаговая визуализация шести сортировок массива int[].
Каждый шаг алгоритма — это полная очистка экрана и новый кадр, поэтому видно, как меняется
последовательность чисел. Весь вывод на русском языке, без ANSI-кодов и внешних библиотек.
- ввод массива вручную с клавиатуры или из текстового файла;
- меню выбора одной сортировки из шести;
- выбор скорости анимации (в том числе пошаговый режим по нажатию Enter);
- сортировка выполняется на копии массива, исходный массив не портится;
- в конце — статистика выбранного алгоритма: сравнения, перестановки/записи, чистое время в наносекундах.
| № | Алгоритм | Вид кадра |
|---|---|---|
| 1 | Быстрая сортировка (Хоара) | индексы, массив, указатели [L] / [R], опорный элемент (Pivot) |
| 2 | Сортировка слиянием | индикатор рекурсии, зона массива, зона временного буфера (_ = пусто), лог шага |
| 3 | Пирамидальная сортировка (куча) | куча в виде текстового дерева, нарушение помечается *(x)* |
| 4 | Пузырьковая сортировка | индексы, массив, указатели [j] / [j+1] |
| 5 | Сортировка вставками | индексы, массив, указатели [j] / [i], текущий key |
| 6 | Сортировка выбором | индексы, массив, указатели [i] / [j] / [min] |
Шаблоны кадров описаны в docs/viz-templates.md.
Нужен JDK 21 (проверялось на Temurin 21). Из корня проекта:
javac -encoding UTF-8 -d out -sourcepath src src\sortvisualizer\Main.java
java -cp out sortvisualizer.MainВ Linux/macOS:
javac -encoding UTF-8 -d out -sourcepath src src/sortvisualizer/Main.java
java -cp out sortvisualizer.MainЕсли в консоли Windows вместо русских букв «кракозябры», переключите кодовую страницу:
chcp 65001Откуда взять массив?
1 - ввести вручную с клавиатуры
2 - прочитать из файла
Ваш выбор: 2
Введите путь к файлу: data\example.txt
Из файла прочитано чисел: 8
Исходный массив: [ 3, 9, 2, 6, 8, 1, 7, 5 ]
Выберите сортировку:
1 - Быстрая сортировка (Хоара)
...
Ваш выбор: 1
Выберите скорость анимации:
1 - очень быстро (без задержки)
...
Ваш выбор: 3
Дальше идут кадры, а в конце — итог:
========================================================================
СОРТИРОВКА ЗАВЕРШЕНА
========================================================================
Исходный массив: [ 3, 9, 2, 6, 8, 1, 7, 5 ]
Отсортированный массив: [ 1, 2, 3, 5, 6, 7, 8, 9 ]
------------------------------------------------------------------------
СТАТИСТИКА АЛГОРИТМА
Алгоритм: Быстрая сортировка (Хоара)
Сравнения: 39
Перестановки/записи: 7
Чистое время: 4700 нс
Обычный текстовый файл с целыми числами. Разделители — пробелы, переводы строк, запятые
или точки с запятой. Пример — data/example.txt:
3 9 2 6 8 1 7 5
src/sortvisualizer/
Main.java точка входа
menu/
Application.java сценарий: ввод → цикл → запуск → статистика
Menu.java выбор алгоритма, скорости, y/n, вывод итога
input/
InputReader.java ввод массива с клавиатуры и из файла
sort/
Sorter.java общий интерфейс сортировок (паттерн "Стратегия")
Algorithms.java список доступных алгоритмов для меню
QuickSort.java быстрая сортировка (разбиение Хоара)
MergeSort.java сортировка слиянием
HeapSort.java пирамидальная сортировка
BubbleSort.java пузырьковая сортировка
InsertionSort.java сортировка вставками
SelectionSort.java сортировка выбором
viz/
Visualizer.java очистка экрана, кадры, общие строки (индексы/массив/указатели)
metrics/
Metrics.java счётчики сравнений, перестановок/записей и таймер
docs/
viz-templates.md шаблоны кадров визуализации
data/
example.txt пример входного файла
- Создать класс в пакете
sortvisualizer.sort, реализующий интерфейсSorter:
package sortvisualizer.sort;
import sortvisualizer.metrics.Metrics;
import sortvisualizer.viz.Visualizer;
public class ShellSort implements Sorter {
public String getName() {
return "Сортировка Шелла";
}
public void sort(int[] a, Visualizer viz, Metrics metrics) {
// ...
viz.pauseTimer(); // таймер стоит, пока собирается и рисуется кадр
viz.show(myFrame(a)); // кадр = шапка + строки массива + текст шага
}
}- Дописать его в массив
ALLвAlgorithms.java— пункт меню появится сам.
Готовые "кирпичики" кадра берутся из Visualizer: header(...), indexRow(...),
arrayRow(...), pointerRow(...), listRange(...), SINGLE_LINE.
- Сравнения — сравнения элементов массива между собой. В сортировке слиянием считаются только сравнения «элемент слева vs элемент справа»; проверки выхода указателей за границы не считаются.
- Перестановки/записи — для обменных сортировок это обмены элементов,
для сортировки слиянием — каждая запись в буфер плюс каждая запись обратно в массив,
для сортировки вставками — каждый сдвиг плюс сама вставка
key. - Чистое время —
System.nanoTime(), суммарное время работы алгоритма. Пока собирается и рисуется кадр (и пока идёт пауза анимации), таймер остановлен (Visualizer.pauseTimer()/Metrics.resumeTimer()), поэтому визуализация во время не попадает.