Разбор задачи: Массив относительной сортировки

Предложенный нами код решения:

 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))
  1. Описание функции: Функция relativeSortArray сортирует массив arr1 так, чтобы элементы, присутствующие в массиве arr2, были упорядочены в том же порядке, что и в arr2. Элементы, отсутствующие в arr2, размещаются в конце массива arr1 в порядке возрастания.

  1. Создание словаря для порядка элементов из 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}
    

  1. Определение ключа для сортировки:

    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)]
    

  1. Возвращение отсортированного массива:

    return sorted(arr1, key=lambda x: (order.get(x, float('inf')), x))
    

    На основе вычисленного ключа массив arr1 сортируется и возвращается.


  1. Пример работы функции:

    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. Остальные элементы расположены в порядке возрастания.


  1. Преимущество подхода:
    • Этот метод легко читается и прост в реализации.
    • Использование словаря позволяет эффективно управлять порядком элементов из arr2.
    • Сортировка остальных элементов гарантирует правильное расположение в массиве.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии