Рубрики
Без рубрики

Самое короткое внедрение Quicksort в Python

QuickSort не должен быть долго и сложен. Понимание одной строки кода достаточно!

Автор оригинала: Chris.

В этом курсе одноклассника вы узнаете о популярном алгоритме сортировки QuickSort Отказ Удивительно, что одна строка кода Python – это все, что вам нужно для написания алгоритма Quicksort!

Если вы просто хотите получить быстрое представление о том, как сделать это в более чем одной строке, ознакомьтесь с этим сообщением Instagram (Swipe направо):

Ein Beitrag Geteilt Von Python Blog (@ finxter.com_) Я

Теперь давайте пойдем в некоторые подробности!

Основы

Quicksort – это не только популярный вопрос во многих кодовых интервью – спросил Google, Facebook и Amazon – но и практичный алгоритм сортировки, который быстро, кратко и читается. Из-за своей красоты вы не найдете много введения в классы алгоритма, которые не обсуждают алгоритм Quicksort.

QuickSort сортирует список, рекурсивно разделяя большую проблему (сортируя список) в меньшие проблемы (сортировка двух меньших списков) и объединение решений от меньших проблем таким образом, чтобы она решала большую проблему. Чтобы решить каждую меньшую проблему, та же самая стратегия используется рекурсивно: меньшие проблемы делятся на даже меньшие подпруты, решающие отдельно и объединенные. В связи с этой стратегией Quicksort принадлежит к классу алгоритмов «разделить и завоевать». Давайте погрузиться глубже в алгоритм Quicksort:

Основная идея QuickSort состоит в том, чтобы выбрать элемент поворота, а затем размещать все элементы, которые больше или равны, чем элемент поворота вправо и все элементы, которые меньше, чем элемент поворота влево. Теперь вы разделили большую проблему сортировки списка на две меньшие подпруты: сортировка права и левой раздел списка. То, что вы делаете сейчас, это рекурсивно повторить эту процедуру, пока вы не получите список нулевых элементов. Этот список уже отсортирован, поэтому рекурсион завершается.

На следующем рисунке показан алгоритм Quicksort в действии:

Рисунок: Алгоритм Quicksort выбирает элемент поворота, разбивает список в (i) несортированным подсредством со всеми элементами, которые меньше или равны, чем Pivot, и (ii) unsorted sublist со всеми элементами, которые больше, чем у поворота. Далее алгоритм Quicksort рекурсивно называется двумя несортированными сублистами, чтобы сортировать их. Как только сублисты содержат максимально один элемент, они отсортированы по определению – заканчивается рекурсион. На каждом уровне рекурсии три сублисты (слева, поворот, справа) объединяются до того, как результирующий список передан на более высокий уровень рекурсиона.

Это приводит нас к следующей проблеме:

Код

Создание функции Q, которая реализует алгоритм Quicksort в одной строке кода Python – и, таким образом, сортирует любой аргумент, приведенный в виде списка целых чисел.

## The Data
unsorted = [33, 2, 3, 45, 6, 54, 33]


## The One-Liner
q = lambda l: q([x for x in l[1:] if x <= l[0]]) + [l[0]] + q([x for x in l if x > l[0]]) if l else []

 
## The Result
print(q(unsorted))

Листинг: одноклассное решение для алгоритма Quicksort с использованием рекурсии.

Что такое выход этого кода?

Как это работает

Мы уже обсудили рекурсивный алгоритм Quicksort выше. Одноклассник напоминает именно обсужденный алгоритм. Во-первых, мы создаем новую функцию лямбда Q, которая принимает только один аргумент списка сразу Лямбда функция имеет следующую структуру:

lambda l: q(left) + pivot + q(right) if l else []

Функция лямбда возвращает пустой список [] в корпусе базы рекурсиона (то есть – список для сортировки пустой и, следовательно, тривиально сортируется). В любом другом случае он выбирает элемент поворота в качестве первого элемента списка L, делит все элементы в два сублиста (влево и вправо) на основе того, меньше ли они меньше или больше, чем у поворота. Для достижения этого мы используем простое понимание списка (см. Главу 3). Поскольку два сублиста не обязательно сортируются, мы рекурсивно выполняем алгоритм Quicksort на них. Наконец, мы объединяем все три списка и вернемся отсортированного списка. Поэтому результатом является:

## The Result
print(q(unsorted))
# [2, 3, 6, 33, 33, 45, 54]

Куда пойти отсюда?

Когда главный кодер смотрит на фрагмент исходного кода, такой как вышеуказанные, смысл кода появляется в их голову в течение нескольких секунд.

Вы достигли этого уровня понимания кода? Вы хотите связаться с ним?

Решите головоломку Python каждый день для непрерывного улучшения. За эти годы вы достигнете этого уровня мастерства – даже если вы делаете это только на стороне. Попробуйте членство Premium Finxter бесплатно – это будет направлять вас в Mastery Python!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/the-quicksort-algorithm-in-one-line-python/”