docs: add even-only merge sort task
This commit is contained in:
@@ -0,0 +1,156 @@
|
|||||||
|
# Техническое задание: сортировка по чётным значениям
|
||||||
|
|
||||||
|
## Задача
|
||||||
|
|
||||||
|
Дополнить существующий алгоритм сортировки слиянием специальной сортировкой, при которой элементы с чётным значением выбранного числового поля сортируются, а элементы с нечётным значением сохраняют свои исходные позиции.
|
||||||
|
|
||||||
|
## Контракты
|
||||||
|
|
||||||
|
1. Стратегия должна реализовывать существующий интерфейс `SortStrategy<T>`.
|
||||||
|
|
||||||
|
2. Стратегия должна работать с `MyList<T>`.
|
||||||
|
|
||||||
|
3. Алгоритм должен быть основан на сортировке слиянием.
|
||||||
|
|
||||||
|
4. Готовые методы сортировки Java использовать запрещено.
|
||||||
|
|
||||||
|
5. Стратегия не должна зависеть непосредственно от класса `Student`.
|
||||||
|
|
||||||
|
6. Числовое поле должно передаваться в стратегию извне в виде функции получения значения:
|
||||||
|
|
||||||
|
```java
|
||||||
|
ToIntFunction<T>
|
||||||
|
```
|
||||||
|
|
||||||
|
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<Student> students = ...;
|
||||||
|
|
||||||
|
SortStrategy<Student> 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<T>` через конструктор и работать с существующими `MyList`, `SortStrategy` и компараторами.
|
||||||
Reference in New Issue
Block a user