User Tools

Site Tools


g3l:lab3_var1

Table of Contents

Лабораторная работа 3.1: Алгоритмы сортировки с визуализацией

Общие требования

  • Язык программирования: любой (C++, Python, Java, C#)
  • Визуализация процесса сортировки обязательна
  • Программа должна показывать каждый шаг/проход алгоритма
  • Входные данные: массив из 10-15 элементов (целые числа)
  • Выходные данные: пошаговый вывод процесса сортировки + итоговый массив

Вариант 1: Пузырьковая сортировка (Bubble Sort) с пошаговым выводом

Тип сортировки: Внутренняя, обменная

Задание: Реализовать классическую сортировку пузырьком. На каждом проходе выводить текущее состояние массива и выделять сравниваемые элементы.

Требования к визуализации:

  • После каждого прохода выводить строку: “Проход X: [массив]”
  • Сравниваемые пары выделять скобками: (a b)
  • Обмены помечать символом “↔”

Пример вывода:

Исходный массив: [5, 1, 4, 2, 8]

Проход 1:
  Сравнение (5 1): 1 <-> 5 -> [1, 5, 4, 2, 8]
  Сравнение (5 4): 4 <-> 5 -> [1, 4, 5, 2, 8]
  Сравнение (5 2): 2 <-> 5 -> [1, 4, 2, 5, 8]
  Сравнение (5 8): обмена нет
Результат прохода 1: [1, 4, 2, 5, 8]

Проход 2:
  ...

Отсортированный массив: [1, 2, 4, 5, 8]

Вариант 2: Сортировка вставками (Insertion Sort) с гистограммой

Тип сортировки: Внутренняя, вставками

Задание: Реализовать сортировку вставками. Визуализировать процесс с помощью ASCII-гистограммы.

Требования к визуализации:

  • Каждый элемент отображается как столбец из символов '#'
  • Высота столбца пропорциональна значению элемента
  • Текущий вставляемый элемент выделять цветом/символом '*'
  • Отсортированную часть отделять вертикальной чертой '|'

Пример вывода:

Шаг 1: Вставляем 4
[###] | [#] [#####] [##]
  3     1     5     2

Шаг 2: Вставляем 5
[#] [###] | [#####] [##]
 1    3       5     2

Вариант 3: Сортировка выбором (Selection Sort) с анимацией в консоли

Тип сортировки: Внутренняя, выбором

Задание: Реализовать сортировку выбором. Создать эффект анимации в консоли (очистка экрана и перерисовка).

Требования к визуализации:

  • Использовать модули времени (sleep) и очистки экрана (clear/cls)
  • Показывать поиск минимального элемента
  • Найденный минимум и текущую позицию для обмена выделять разными цветами
  • Выводить счетчик сравнений

Пример вывода (кадры анимации):

[5] {1} [4] [2] [8]  (Поиск минимума: {1} - кандидат)
[5] [1] [4] {2} [8]  (Найден новый минимум {2})
Обмен: [1] <-> [5]
[1] [5] [4] [2] [8]  (После обмена)

Вариант 4: Быстрая сортировка (Quick Sort) с рекурсивным деревом

Тип сортировки: Внутренняя, рекурсивная

Задание: Реализовать быструю сортировку (алгоритм Хоара). Визуализировать процесс в виде дерева рекурсии.

Требования к визуализации:

  • Показывать выбор опорного элемента (Pivot)
  • Отображать разделение массива на левую и правую части
  • Выводить отступами уровень рекурсии
  • После каждой рекурсии показывать объединенный результат

Пример вывода:

Уровень 0: [5, 1, 4, 2, 8] (pivot=5)
  Левая часть: [1, 4, 2]
    Уровень 1: [1, 4, 2] (pivot=1)
      Левая часть: [] (пусто)
      Правая часть: [4, 2]
        Уровень 2: [4, 2] (pivot=4)
          Левая часть: [2]
          Правая часть: []
        Возврат: [2, 4]
    Возврат: [1, 2, 4]
  Правая часть: [8]
Возврат: [1, 2, 4, 5, 8]

Вариант 5: Сортировка слиянием (Merge Sort) с визуализацией слияний

Тип сортировки: Внешняя/внутренняя, рекурсивная

Задание: Реализовать сортировку слиянием. Показать процесс разделения и слияния массивов.

Требования к визуализации:

  • Показывать разделение массива на две половины (стрелками вниз)
  • Показывать процесс слияния (стрелками вверх)
  • При слиянии выводить сравниваемые элементы из двух половин
  • Использовать квадратные скобки для отслеживания указателей

Пример вывода:

Делим: [5, 1, 4, 2, 8]
       /            \
  [5, 1, 4]       [2, 8]
   /     \        /    \
[5]     [1,4]    [2]   [8]
        /  \
      [1]  [4]

Сливаем:
  Слияние [1] и [4] -> [1, 4]
  Слияние [5] и [1, 4] -> сравниваем 5 и 1, берем 1; сравниваем 5 и 4, берем 4; берем 5 -> [1, 4, 5]
  Слияние [2] и [8] -> [2, 8]
  Слияние [1, 4, 5] и [2, 8] -> [1, 2, 4, 5, 8]

Вариант 6: Шейкерная сортировка (Cocktail Shaker Sort) с направлением

Тип сортировки: Внутренняя, обменная

Задание: Реализовать двунаправленную пузырьковую сортировку. Визуализировать направление движения.

Требования к визуализации:

  • Использовать стрелки для показа направления прохода (→ и ←)
  • После каждого прохода показывать границы отсортированной части
  • Выводить текущее положение “шейкера”

Пример вывода:

Исходный: [5, 1, 4, 2, 8]

Проход → (0→3):
  [1, 5, 4, 2, 8] (обмен 5 и 1)
  [1, 4, 5, 2, 8] (обмен 5 и 4)
  [1, 4, 2, 5, 8] (обмен 5 и 2)
Результат: [1, 4, 2, 5, 8]

Проход ← (3→1):
  [1, 4, 2, 5, 8] ←
  [1, 2, 4, 5, 8] (обмен 4 и 2 на позициях 1-2)
Результат: [1, 2, 4, 5, 8]

Вариант 7: Сортировка Шелла (Shell Sort) с визуализацией шагов

Тип сортировки: Внутренняя, вставками с шагом

Задание: Реализовать сортировку Шелла. Показать влияние выбора шага (последовательность Шелла: N/2, N/4, …, 1).

Требования к визуализации:

  • Для каждого шага показывать, какие элементы сравниваются (разноцветное выделение)
  • Выводить значение текущего шага (gap)
  • Показывать подмассивы, которые сортируются отдельно

Пример вывода:

Массив: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Шаг 1: gap = 5
  Сортируем подмассивы:
  [9, 4] -> [4, 9]  (индексы 0 и 5)
  [8, 3] -> [3, 8]  (индексы 1 и 6)
  [7, 2] -> [2, 7]  (индексы 2 и 7)
  [6, 1] -> [1, 6]  (индексы 3 и 8)
  [5, 0] -> [0, 5]  (индексы 4 и 9)
После шага 1: [4, 3, 2, 1, 0, 9, 8, 7, 6, 5]

Вариант 8: Сортировка подсчетом (Counting Sort) с частотным словарем

Тип сортировки: Внутренняя, не сравнительная

Задание: Реализовать сортировку подсчетом для чисел в небольшом диапазоне (0-20). Визуализировать подсчет частот.

Требования к визуализации:

  • Показать процесс подсчета количества вхождений каждого числа
  • Визуализировать массив счетчиков в виде гистограммы
  • Показать восстановление отсортированного массива

Пример вывода:

Исходный массив: [4, 2, 2, 8, 3, 3, 1]

Подсчет частот:
Значение: 0 1 2 3 4 5 6 7 8
Счетчик: [0,1,2,2,1,0,0,0,1]

Визуализация счетчиков:
  2: ##
  3: ##
  1: #
  4: #
  8: #

Восстановление:
  Берем 1 (1 раз): [1]
  Берем 2 (2 раза): [1, 2, 2]
  Берем 3 (2 раза): [1, 2, 2, 3, 3]
  Берем 4 (1 раз): [1, 2, 2, 3, 3, 4]
  Берем 8 (1 раз): [1, 2, 2, 3, 3, 4, 8]

Вариант 9: Поразрядная сортировка (Radix Sort) с разрядами

Тип сортировки: Внутренняя, цифровая

Задание: Реализовать поразрядную сортировку (LSD - от младшего разряда к старшему). Визуализировать сортировку по каждому разряду.

Требования к визуализации:

  • Показывать текущий разряд (единицы, десятки, сотни)
  • Визуализировать распределение по корзинам (0-9)
  • Показывать сборку массива после каждого разряда

Пример вывода:

Массив: [170, 45, 75, 90, 2, 24, 802, 66]

Разряд 1 (единицы):
  Распределение по корзинам:
  0: [170, 90]
  2: [2, 802]
  4: [24]
  5: [45, 75]
  6: [66]
  Сборка: [170, 90, 2, 802, 24, 45, 75, 66]

Разряд 2 (десятки):
  Распределение по корзинам:
  0: [2, 802]
  2: [24]
  4: [45]
  6: [66]
  7: [170, 75]
  9: [90]
  Сборка: [2, 802, 24, 45, 66, 170, 75, 90]

Вариант 10: Пирамидальная сортировка (Heap Sort) с визуализацией кучи

Тип сортировки: Внутренняя, пирамидальная

Задание: Реализовать пирамидальную сортировку. Визуализировать построение max-кучи и процесс извлечения элементов.

Требования к визуализации:

  • Показывать бинарное дерево в текстовом виде
  • Выделять текущую “просеиваемую” вершину
  • Показывать обмен корня с последним элементом

Пример вывода:

Построение кучи:
      5
     / \
    1   4
   / \
  2   8

Просеиваем 5:
      8
     / \
    5   4
   / \
  2   1

Сортировка:
  Корень=8, меняем с последним=1
      1
     / \
    5   4
   /
  2
  Просеиваем 1:
      5
     / \
    1   4
   /
  2
  ...

Вариант 11: Сортировка бинарным деревом (Binary Tree Sort) с графическим выводом

Тип сортировки: Внешняя (структура данных - дерево)

Задание: Реализовать сортировку с помощью бинарного дерева поиска. Визуализировать построение дерева.

Требования к визуализации:

  • Показывать вставку каждого элемента в дерево
  • Отображать дерево с отступами (правые поддеревья с большим отступом)
  • Показать симметричный обход (in-order traversal) для получения отсортированного массива

Пример вывода:

Вставляем 5:
  5

Вставляем 3:
  5
 /
3

Вставляем 7:
  5
 / \
3   7

Вставляем 2:
    5
   / \
  3   7
 /
2

Обход (in-order): 2, 3, 5, 7

Вариант 12: Гномья сортировка (Gnome Sort) с "шагами гнома"

Тип сортировки: Внутренняя, обменная

Задание: Реализовать гномью сортировку. Визуализировать перемещение “гнома” по массиву.

Требования к визуализации:

  • Позицию гнома отмечать символом '@'
  • Показывать движение вперед (→) и назад (←)
  • Выводить каждое перемещение гнома

Пример вывода:

[@5, 1, 4, 2, 8] (начало)
[5, @1, 4, 2, 8] (шаг вперед, 5>1 - меняем)
[1, @5, 4, 2, 8] (шаг назад, сравниваем 1 и 5 - порядок норм)
[1, 5, @4, 2, 8] (шаг вперед, 5>4 - меняем)
[1, @4, 5, 2, 8] (шаг назад, 1<4 - норм, шаг вперед)
[1, 4, @5, 2, 8] (5>2 - меняем)
[1, 4, 2, @5, 8] (шаг назад, 4>2 - меняем)
[1, 2, 4, @5, 8] (шаг назад, 1<2 - норм, вперед до конца)

Вариант 13: Сортировка расческой (Comb Sort) с визуализацией фактора

Тип сортировки: Внутренняя, обменная

Задание: Реализовать сортировку расческой (улучшенный пузырек с уменьшающимся шагом). Визуализировать влияние фактора уменьшения.

Требования к визуализации:

  • Показывать текущий шаг (gap)
  • Сравниваемые элементы соединять линией в выводе
  • Показывать уменьшение шага

Пример вывода:

Массив: [8, 4, 1, 5, 9, 2, 7, 3]
Фактор: 1.247

Шаг 1: gap = 8 → 6
  [8]----[2] → 8>2, меняем: [2, 4, 1, 5, 9, 8, 7, 3]
  [4]----[7] → 4<7, без обмена
  [1]----[3] → 1<3, без обмена

Шаг 2: gap = 6 → 4
  [2]----[9] → 2<9, без обмена
  ...

Вариант 14: Сортировка перемешиванием (Odd-Even Sort) с параллельными сравнениями

Тип сортировки: Внутренняя, параллельная

Задание: Реализовать сортировку чет-нечет (Odd-Even Transposition Sort). Визуализировать фазы четных и нечетных сравнений.

Требования к визуализации:

  • Четную фазу выделять одним цветом, нечетную - другим
  • Показывать все сравнения в фазе одновременно (как при параллельной работе)
  • Выводить номер итерации и фазы

Пример вывода:

Итерация 1:
  Фаза 1 (четные индексы 0,2,4):
    Сравниваем (0,1): [5,1] → [1,5]
    Сравниваем (2,3): [4,2] → [2,4]
    Сравниваем (4,5): [8,?] - нет пары
    Результат: [1, 5, 2, 4, 8]
  
  Фаза 2 (нечетные индексы 1,3):
    Сравниваем (1,2): [5,2] → [2,5]
    Сравниваем (3,4): [4,8] → без обмена
    Результат: [1, 2, 5, 4, 8]

Вариант 15: Timsort (гибрид сортировки вставками и слиянием) с определением RUN

Тип сортировки: Внутренняя, гибридная

Задание: Реализовать упрощенный Timsort (разбиение на RUN и слияние). Визуализировать обнаружение естественно упорядоченных подмассивов (RUN).

Требования к визуализации:

  • Найти и выделить естественно упорядоченные последовательности (возрастающие/убывающие)
  • Развернуть убывающие последовательности
  • Отсортировать каждый RUN сортировкой вставками
  • Слить RUN'ы с визуализацией слияния

Пример вывода:

Анализ массива [5, 3, 2, 8, 9, 1, 4, 7]:

Поиск RUN'ов:
  RUN 1 (убывающий): [5, 3, 2] → разворачиваем → [2, 3, 5]
  RUN 2 (возрастающий): [8, 9]
  RUN 3 (возрастающий): [1, 4, 7]

После сортировки RUN'ов вставками (минимальные улучшения):
  RUN 1: [2, 3, 5]
  RUN 2: [8, 9]
  RUN 3: [1, 4, 7]

Слияние RUN 1 и RUN 2:
  Сравниваем 2 и 8 → берем 2
  Сравниваем 3 и 8 → берем 3
  ...
  Результат: [2, 3, 5, 8, 9]

Слияние с RUN 3:
  Сравниваем 2 и 1 → берем 1
  Сравниваем 2 и 4 → берем 2
  ...
  Итог: [1, 2, 3, 4, 5, 7, 8, 9]

Критерии оценки

  • 3 балла: Реализован алгоритм сортировки, есть базовый вывод
  • 4 балла: Реализована визуализация согласно варианту, код структурирован
  • 5 баллов: Добавлена интерактивность (пошаговый режим/выбор скорости), понятный интерфейс, обработка ошибок

Вариант 1: Массив: [64, 34, 25, 12, 22, 11, 90]

Вариант 2: Массив: [5, 1, 4, 2, 8]

Вариант 3: Массив: [100, 90, 80, 70, 60, 50, 40, 30, 20, 10]

Вариант 4: Массив: [3, 6, 1, 8, 4, 9, 2, 7, 5]

Вариант 5: Массив: [45, 23, 67, 12, 89, 34, 56, 78]

Вариант 6: Массив: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Вариант 7: Массив: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Вариант 8: Массив: [29, 10, 14, 37, 13, 25, 48, 7]

Вариант 9: Массив: [55, 33, 77, 11, 99, 44, 66, 22, 88]

Вариант 10: Массив: [15, 25, 35, 45, 55, 65, 75, 85, 95]

Вариант 11: Массив: [95, 85, 75, 65, 55, 45, 35, 25, 15]

Вариант 12: Массив: [42, 17, 89, 63, 31, 76, 24, 58]

Вариант 13: Массив: [8, 3, 1, 6, 9, 2, 7, 4, 5]

Вариант 14: Массив: [100, 50, 25, 75, 12, 37, 62, 87]

Вариант 15: Массив: [19, 28, 37, 46, 55, 64, 73, 82, 91]

Вариант 16: Массив: [91, 82, 73, 64, 55, 46, 37, 28, 19]

Вариант 17: Массив: [6, 2, 9, 4, 7, 1, 8, 3, 5]

Вариант 18: Массив: [33, 66, 99, 11, 44, 77, 22, 55, 88]

Вариант 19: Массив: [14, 27, 39, 52, 65, 78, 81, 93]

Вариант 20: Массив: [93, 81, 78, 65, 52, 39, 27, 14]

g3l/lab3_var1.txt · Last modified: by eugeneai