Программа курса:
Разбор задачи: Массив относительной сортировки
Предложенный нами код решения:
def relativeSortArray(arr1, arr2):
"""
Сортирует массив arr1 в соответствии с порядком элементов из arr2.
Элементы, отсутствующие в arr2, добавляются в конец в порядке возрастания.
:param arr1: список целых чисел, элементы которого нужно отсортировать
:param arr2: список целых чисел, задающий порядок сортировки
:return: список целых чисел, отсортированный в соответствии с условиями задачи
"""
# Создаем словарь для хранения порядка элементов из arr2
order = {value: index for index, value in enumerate(arr2)}
# Сортируем массив arr1: сначала по порядку из arr2, затем оставшиеся элементы по возрастанию
return sorted(arr1, key=lambda x: (order.get(x, float('inf')), x))- Описание функции: Функция
relativeSortArrayсортирует массивarr1так, чтобы элементы, присутствующие в массивеarr2, были упорядочены в том же порядке, что и вarr2. Элементы, отсутствующие вarr2, размещаются в конце массиваarr1в порядке возрастания.
Создание словаря для порядка элементов из
arr2:order = {value: index for index, value in enumerate(arr2)}Здесь создается словарь, где ключи — это элементы массива
arr2, а значения — их индексы. Это позволяет быстро определить порядок каждого элемента изarr2.Пример:
Еслиarr2 = [2, 1, 4, 3], то словарьorderбудет таким:{2: 0, 1: 1, 4: 2, 3: 3}
Определение ключа для сортировки:
key=lambda x: (order.get(x, float('inf')), x)Сортировка производится по двум критериям:
- Если элемент есть в словаре
order, то используется его значение (индекс изarr2). - Если элемент отсутствует в
arr2, ему присваивается значение по умолчаниюfloat('inf')(бесконечность). Это гарантирует, что такие элементы окажутся в конце. - Для элементов с одинаковым индексом из
arr2сохраняется их порядок в массивеarr1.
Пример:
Дляarr1 = [2, 3, 1, 4, 6]иarr2 = [2, 1, 4]ключи для сортировки будут такими:[(0, 2), (3, 3), (1, 1), (2, 4), (inf, 6)]- Если элемент есть в словаре
Возвращение отсортированного массива:
return sorted(arr1, key=lambda x: (order.get(x, float('inf')), x))На основе вычисленного ключа массив
arr1сортируется и возвращается.
Пример работы функции:
arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19] arr2 = [2, 1, 4, 3, 9, 6] result = relativeSortArray(arr1, arr2)Разбор выполнения:
- Словарь
order:{2: 0, 1: 1, 4: 2, 3: 3, 9: 4, 6: 5} Ключи для элементов из
arr1:[(0, 2), (3, 3), (1, 1), (3, 3), (0, 2), (2, 4), (5, 6), (inf, 7), (4, 9), (0, 2), (inf, 19)]- Отсортированный массив:
[2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19].
Вывод: Элементы из
arr1, присутствующие вarr2, упорядочены в соответствии сarr2. Остальные элементы расположены в порядке возрастания.- Словарь
- Преимущество подхода:
- Этот метод легко читается и прост в реализации.
- Использование словаря позволяет эффективно управлять порядком элементов из
arr2. - Сортировка остальных элементов гарантирует правильное расположение в массиве.