-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShellSortTask.txt
More file actions
118 lines (88 loc) · 8.01 KB
/
ShellSortTask.txt
File metadata and controls
118 lines (88 loc) · 8.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Система приоритетов обработки событий в игровом движке
Контекст
Ты разрабатываешь консольную RPG.
В игре есть система событий, которая обрабатывает действия персонажей, врагов и окружения.
Каждое событие имеет приоритет выполнения (чем выше приоритет, тем раньше оно должно быть обработано).
Однако в процессе игры события постоянно добавляются и изменяются.
Геймдизайнер заметил, что в моменты массовых боев (когда происходит много событий одновременно)
игра начинает "тормозить", потому что текущая система сортировки событий неэффективна.
Твоя задача — реализовать оптимизированную систему сортировки событий по приоритету, используя сортировку Шелла.
Это позволит быстро пересортировывать список событий при добавлении новых элементов, не дожидаясь окончания всех боев.
Что нужно сделать:
1. Создай класс GameEvent
У события должны быть следующие свойства:
- int Id - уникальный идентификатор (генерируется автоматически)
- string Name - название события (например, "Атака героя", "Применение зелья", "Ход врага")
- int Priority - приоритет выполнения (от 1 до 100, где 100 — самый высокий)
- string Description - текстовое описание события
- DateTime CreatedAt - время создания события
2. Создай класс EventQueue
Этот класс должен управлять списком событий и использовать сортировку Шелла
для их упорядочивания по приоритету (по убыванию: самые высокие приоритеты в начале).
Методы класса:
- void AddEvent(GameEvent newEvent) - добавить событие и частично пересортировать список
(оптимизированно, не вызывая полную сортировку каждый раз)
- GameEvent GetNextEvent() - получить и удалить событие с наивысшим приоритетом
- void SortEvents() - полная пересортировка всех событий (использует сортировку Шелла)
- void DisplayEvents() - вывести все события в порядке их выполнения
- List<GameEvent> GetEventsByPriorityRange(int minPriority, int maxPriority) -
получить события в заданном диапазоне приоритетов (LINQ)
3. Реализуй сортировку Шелла
Ты должен написать метод ShellSort(List<GameEvent> events),
который сортирует события по убыванию приоритета (от высокого к низкому).
В случае одинакового приоритета — сортировать по времени создания
(более старые события должны выполняться раньше).
Важно: Сортировка должна быть реализована вручную, без использования OrderBy из LINQ
(LINQ можно использовать только для выборки, но не для сортировки).
4. Добавь обработку ошибок
При добавлении события, если приоритет выходит за пределы 1-100,
должно выбрасываться исключение с понятным сообщением.
Сценарий использования (что должно происходить в Main):
1. Создать EventQueue.
2. Добавить 10-15 событий с разными приоритетами (можно генерировать случайно).
3. Вывести все события до сортировки.
4. Вызвать SortEvents() и вывести отсортированный список (показать, что сортировка Шелла сработала правильно).
5. Продемонстрировать добавление новых событий после сортировки.
6. Показать работу GetNextEvent() (извлечь 3-5 событий с наивысшим приоритетом).
7. Показать работу GetEventsByPriorityRange() с использованием LINQ.
8. Продемонстрировать обработку ошибок (попытаться добавить событие с приоритетом 150).
Пример работы программы (ожидаемый вывод):
=== Инициализация событий ===
Добавлено 12 событий.
=== События ДО сортировки ===
1. [P:45] Атака героя
2. [P:82] Ход босса
3. [P:12] Восстановление здоровья
...
=== СОРТИРОВКА ШЕЛЛА ===
События отсортированы за 3 прохода.
=== События ПОСЛЕ сортировки ===
1. [P:95] Ультимейшн героя
2. [P:88] Атака дракона
3. [P:82] Ход босса
...
=== Обработка событий ===
Обработано событие: Ультимейшн героя (P:95)
Обработано событие: Атака дракона (P:88)
Обработано событие: Ход босса (P:82)
=== События с приоритетом от 50 до 100 ===
- Ультимейшн героя (P:95)
- Атака дракона (P:88)
- Ход босса (P:82)
...
=== Проверка обработки ошибок ===
Попытка добавить событие с приоритетом 150...
Ошибка: Приоритет события должен быть в диапазоне от 1 до 100.
Бонус-задание (если будет легко):
Добавь в EventQueue возможность сохранять текущий список событий в JSON-файл и загружать из него.
Используй сериализацию (Newtonsoft.Json или System.Text.Json).
Это покажет, как сортировка Шелла может использоваться в связке с сохранением данных.
Ограничения (что НЕЛЬЗЯ использовать):
- Не использовать встроенные методы сортировки C# (например, List<T>.Sort или OrderBy для сортировки)
- Можно использовать LINQ только для выборки (Where, Select), но не для сортировки
Подсказки по сортировке Шелла:
1. Шаг (gap) обычно начинают с n/2 и уменьшают в 2 раза на каждой итерации
2. Для последовательности шагов можно использовать формулу: gap /= 2
3. Внутри каждого шага работает сортировка вставками
4. Для сортировки по убыванию приоритета:
events[j].Priority < events[j + gap].Priority меняем местами