diff --git a/docs/tasks/EvenOnlyMergeSort.md b/docs/tasks/EvenOnlyMergeSort.md new file mode 100644 index 0000000..acfd270 --- /dev/null +++ b/docs/tasks/EvenOnlyMergeSort.md @@ -0,0 +1,156 @@ +# Техническое задание: сортировка по чётным значениям + +## Задача + +Дополнить существующий алгоритм сортировки слиянием специальной сортировкой, при которой элементы с чётным значением выбранного числового поля сортируются, а элементы с нечётным значением сохраняют свои исходные позиции. + +## Контракты + +1. Стратегия должна реализовывать существующий интерфейс `SortStrategy`. + +2. Стратегия должна работать с `MyList`. + +3. Алгоритм должен быть основан на сортировке слиянием. + +4. Готовые методы сортировки Java использовать запрещено. + +5. Стратегия не должна зависеть непосредственно от класса `Student`. + +6. Числовое поле должно передаваться в стратегию извне в виде функции получения значения: + +```java +ToIntFunction +``` + +1. Функция получения числового значения должна: + + - возвращать значение выбранного поля; + - использоваться для проверки чётности; + - не содержать дополнительной логики сортировки. + +2. Стратегия не должна самостоятельно выбирать поле через: + + - `if`; + - `switch`; + - проверку типа `Student`; + - прямое обращение к конкретным полям `Student`. + +3. Для `Student` доступны функции получения числовых полей: + +```java +Student::getGroupNumber +Student::getRecordBookNumber +``` + + 1. Поле `averageGrade` не используется для определения чётности, если оно имеет нецелочисленный тип. + +## Правила сортировки + +1. Элементы с чётным значением выбранного поля участвуют в сортировке. + +2. Элементы с нечётным значением выбранного поля не перемещаются. + +3. Чётные элементы должны занимать только те позиции, которые до сортировки принадлежали чётным элементам. + +4. Чётные элементы сортируются в натуральном порядке выбранного числового поля. + +5. Нечётные элементы должны остаться на своих исходных позициях. + +6. Количество элементов коллекции не должно изменяться. + +### Пример + +Исходная коллекция: + +```text +[3, 8, 5, 2, 4, 7] +``` + +Результат: + +```text +[3, 2, 5, 4, 8, 7] +``` + +Нечётные значения `3`, `5`, `7` остались на исходных позициях. + +Чётные значения `8`, `2`, `4` были отсортированы по возрастанию и заняли позиции, которые изначально принадлежали чётным элементам. + +## Примеры тестов + +### Тест сортировки по номеру группы + +Использовать `Student::getGroupNumber`: + +```java +MyList students = ...; + +SortStrategy strategy = + new EvenOnlyMergeSortStrategy<>(Student::getGroupNumber); + +strategy.sort(students, new StudentGroupComparator()); +``` + +Проверить, что: + +- студенты с нечётным номером группы остались на исходных позициях; +- студенты с чётным номером группы отсортированы по возрастанию; +- количество элементов не изменилось. + +### Тест сортировки по номеру зачётной книжки + +Использовать `Student::getRecordBookNumber`. + +Проверить те же условия для номера зачётной книжки. + +### Тест без чётных элементов + +Исходные значения: + +```text +[1, 3, 5, 7] +``` + +Результат должен быть идентичен исходной коллекции. + +### Тест без нечётных элементов + +Исходные значения: + +```text +[8, 2, 6, 4] +``` + +Результат: + +```text +[2, 4, 6, 8] +``` + +### Тест с одним элементом + +Исходные значения: + +```text +[4] +``` + +Результат: + +```text +[4] +``` + +### Тест с пустой коллекцией + +Сортировка пустой коллекции не должна приводить к ошибке. + +## Результат + +Реализовать: + +```text +EvenOnlyMergeSortStrategy.java +``` + +Класс должен принимать `ToIntFunction` через конструктор и работать с существующими `MyList`, `SortStrategy` и компараторами.