Преобразование Шварца - это метод, используемый в компьютерном программировании для сортировки элементов массива с ключевыми свойствами. Это уместно, когда у нас есть интенсивная вычислительная операция сортировки на основе сравнения. Преобразование Шварца примечательно тем, что в нем не используются именованные временные массивы.

Впервые он был создан Рэндалом Шварцем в 1994 году для сортировки массива на языке Perl.

#!/usr/bin/perl
require 5; # new features, new bugs!
print
  map { $_->[0] }
  sort { $a->[1] cmp $b->[1] }
  map { [$_, /(\S+)$/] }
  <>;

Шаги:

  1. На первом этапе вычисляется ключ для сортировки. Он объединяет это с исходным значением в кортеже.
  2. Средний шаг сортирует вычисленный элемент в кортеже.
  3. Последний шаг извлекает исходное значение из кортежа.

Пример использования в Javascript сортировки массива со свойством с определенной датой по убыванию:

При кодировании вы, вероятно, отсортируете массив, как следующий код, даже не задумываясь:

function sortByDate(data) {
    return data.sort((a, b) => new Date(b.eventTime) — new     Date(a.eventTime));
}

Хотя это может сработать, это не оптимально. Более оптимальным способом сортировки было бы использование преобразования Шварца:

function sortByDate(data) {
    return data
           .map((item) => ([+new Date(item.eventTime), item]))
           .sort(([a], [b]) => b - a)
           .map(([, item]) => item);
}

Зачем составлять карту перед сравнением?

Очевидно, что мы не можем уменьшить количество выполнений функции сравнения, но мы можем сократить объем работы до минимума. Вместо того, чтобы оценивать каждый элемент при каждом сравнении, мы извлекаем примитив свойства каждого элемента, который хотим сравнить, выполняя оценку один раз. Это вычисление выполняется при первом отображении.