Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: quicksort, merge sort, time complexity, worst case, sorting algorithms

Чем quicksort отличается от merge sort в худшем случае?

Вопрос проверяет понимание различий в производительности алгоритмов сортировки quicksort и merge sort в худшем случае.

Короткий ответ

В худшем случае quicksort имеет сложность O(n²), что происходит при неудачном выборе опорного элемента, например, когда массив уже отсортирован. Merge sort всегда имеет сложность O(n log n), так как он делит массив пополам независимо от данных. Quicksort обычно быстрее на практике, но может деградировать, в то время как merge sort стабилен по времени.

Длинный ответ

Основное различие в худшем случае

Quicksort и merge sort — это два популярных алгоритма сортировки, основанных на принципе "разделяй и властвуй". Однако их поведение в худшем случае кардинально отличается из-за разной стратегии разделения данных.

Quicksort: худший случай O(n²)

Quicksort выбирает опорный элемент (pivot) и делит массив на две части: элементы меньше pivot и больше pivot. В худшем случае, если pivot каждый раз оказывается минимальным или максимальным элементом (например, при уже отсортированном массиве и выборе первого элемента как pivot), разделение становится крайне неравномерным: одна часть содержит n-1 элемент, а другая — 0. Это приводит к рекурсивной глубине n и общей сложности O(n²).

function quicksort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[0]; // плохой выбор для отсортированного массива
  const left = arr.slice(1).filter(x => x < pivot);
  const right = arr.slice(1).filter(x => x >= pivot);
  return [...quicksort(left), pivot, ...quicksort(right)];
}

Merge sort: всегда O(n log n)

Merge sort делит массив пополам независимо от значений элементов, что гарантирует равномерное разделение. Даже в худшем случае глубина рекурсии составляет log n, а на каждом уровне выполняется слияние за O(n). Таким образом, общая сложность всегда O(n log n).

function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));
  return merge(left, right);
}

Практические соображения

Несмотря на худший случай O(n²), quicksort часто быстрее на реальных данных благодаря меньшим накладным расходам и хорошей локальности кэша. Merge sort требует дополнительной памяти O(n) для слияния, что может быть критично для больших массивов. Выбор между ними зависит от контекста: quicksort предпочтителен для общих задач, а merge sort — когда важна гарантированная производительность.

Вывод: Quicksort эффективнее в среднем, но может деградировать; merge sort стабилен по времени, но требует больше памяти. Используйте quicksort для быстрой сортировки в памяти, а merge sort — для сортировки больших данных или когда важна предсказуемость.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#quicksort

#merge sort

#time complexity

#worst case

#sorting algorithms

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.