Как обычный сорт отсортирует массив чисел и какой будет результат?
Что проверяют
Знаете ли вы, что Array.prototype.sort() без аргументов сравнивает элементы как строки. Это ловушка на знание спецификации, а не вопрос про алгоритмы сортировки. Следом просят исправить и спрашивают, меняет ли sort исходный массив.
Как отвечать
Сразу дайте результат на примере:
[10, 1, 5, 100, 25].sort(); // [1, 10, 100, 25, 5]
[-1, -2, 3].sort(); // [-1, -2, 3]Без функции сравнения каждый элемент приводится к строке, и строки сравниваются по кодовым единицам UTF-16, как в словаре: "100" меньше "25", потому что "1" меньше "2". Поэтому числа выстраиваются «по первой цифре».
Дальше по пунктам:
- исправление:
arr.sort((a, b) => a - b)по возрастанию,(a, b) => b - aпо убыванию. Функция должна вернуть отрицательное число, ноль или положительное; - мутация:
sortсортирует массив на месте и возвращает ссылку на него же. В React-состоянии это ломает сравнение по ссылке, поэтому берутtoSorted()из ES2023 или копию[...arr].sort(...); - стабильность: с ES2019 сортировка обязана быть стабильной, элементы с равным ключом сохраняют исходный порядок. Это важно, когда объекты сортируют по нескольким полям;
undefined: такие элементы всегда уходят в конец и в функцию сравнения не передаются;- типизированные массивы:
Int32ArrayиFloat64Arrayпо умолчанию сортируются как числа.
Про внутренний алгоритм хватит одной фразы: в V8 это TimSort со сложностью O(n log n). Пузырёк здесь ни при чём.
Где спотыкаются
Отвечают, что массив отсортируется по возрастанию. Именно на это вопрос и рассчитан.
Пишут компаратор (a, b) => a > b. Он возвращает true или false, то есть 1 или 0 и никогда отрицательное число, и результат зависит от движка и входных данных.
Сортируют массив из пропсов или стора прямо через sort. Исходные данные меняются у всех, кто на них ссылается, а компонент может не перерисоваться.