Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SortVisualizer

Консольная программа на 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          пример входного файла

Как добавить новую сортировку

  1. Создать класс в пакете 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));      // кадр = шапка + строки массива + текст шага
    }
}
  1. Дописать его в массив ALL в Algorithms.java — пункт меню появится сам.

Готовые "кирпичики" кадра берутся из Visualizer: header(...), indexRow(...), arrayRow(...), pointerRow(...), listRange(...), SINGLE_LINE.

Как считаются метрики

  • Сравнения — сравнения элементов массива между собой. В сортировке слиянием считаются только сравнения «элемент слева vs элемент справа»; проверки выхода указателей за границы не считаются.
  • Перестановки/записи — для обменных сортировок это обмены элементов, для сортировки слиянием — каждая запись в буфер плюс каждая запись обратно в массив, для сортировки вставками — каждый сдвиг плюс сама вставка key.
  • Чистое времяSystem.nanoTime(), суммарное время работы алгоритма. Пока собирается и рисуется кадр (и пока идёт пауза анимации), таймер остановлен (Visualizer.pauseTimer() / Metrics.resumeTimer()), поэтому визуализация во время не попадает.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages