22 lines
2.4 KiB
Markdown
Executable File
22 lines
2.4 KiB
Markdown
Executable File
Один из самых быстрых известных универсальных алгоритмов сортировки массивов: в среднем [Сложность алгоритма](Оценка%20сложности%20алгоритма) $O(n\log(n))$ обменов при упорядочении $n$ элементов, из-за наличия ряда недостатков на практике обычно используется с некоторыми доработками.
|
||
#### Алгоритм
|
||
Алгоритм состоит из трёх шагов:
|
||
1. Выбрать элемент из массива. Назовём его опорным.
|
||
2. Разбиение: перераспределение элементов в массиве таким образом, что элементы, меньшие опорного, помещаются перед ним, а большие или равные — после.
|
||
3. Рекурсивно применить первые два шага к двум подмассивам слева и справа от опорного элемента. Рекурсия не применяется к массиву, в котором только один элемент или отсутствуют элементы.
|
||
|
||
В ранних реализациях, как правило, опорным выбирался первый элемент, что снижало производительность на отсортированных массивах. Для улучшения эффективности может выбираться средний, случайный элемент или (для больших массивов) медиана первого, среднего и последнего элементов. Медиана всей последовательности является оптимальным опорным элементом, но её вычисление слишком трудоёмко для использования в сортировке.
|
||
#### Пример
|
||
![[sort_qsort.gif]]
|
||
#### В виде кода
|
||
```python
|
||
def quicksort(arr):
|
||
if len(arr) <= 1:
|
||
return arr
|
||
pivot = arr[len(arr) // 2]
|
||
left = [x for x in arr if x < pivot]
|
||
middle = [x for x in arr if x == pivot]
|
||
right = [x for x in arr if x > pivot]
|
||
return quicksort(left) + middle + quicksort(right)
|
||
|
||
``` |