Алгосы
This commit is contained in:
22
математика/Быстрая сортировка.md
Normal file
22
математика/Быстрая сортировка.md
Normal file
@@ -0,0 +1,22 @@
|
||||
Один из самых быстрых известных универсальных алгоритмов сортировки массивов: в среднем [Сложность алгоритма](Оценка%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)
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user