← Назад к вопросам
Какие знаешь сложности алгоритма сортировки Python?
1.8 Middle🔥 171 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Сложность алгоритмов сортировки в Python
Встроенная сортировка: Timsort
Python использует Timsort для встроенной функции sort() и sorted(). Это гибридный алгоритм, сочетающий merge sort и insertion sort:
- Временная сложность: O(n log n) в худшем случае
- Пространственная сложность: O(n)
- Лучший случай: O(n) на уже отсортированных или близких к отсортированным данных
Тimsort оптимизирован именно для реальных данных, а не для худшего случая, поэтому он работает лучше чистого merge sort на практике.
Классические алгоритмы сортировки
Bubble Sort (пузырьковая сортировка)
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
- Временная сложность: O(n²) во всех случаях
- Пространственная сложность: O(1)
- Использование: только в образовательных целях
Quick Sort (быстрая сортировка)
def quick_sort(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 quick_sort(left) + middle + quick_sort(right)
- Временная сложность: O(n log n) в среднем, O(n²) в худшем
- Пространственная сложность: O(log n) для рекурсивного стека
- Преимущество: в среднем быстрее merge sort на практике
Merge Sort (сортировка слиянием)
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
return result + left[i:] + right[j:]
- Временная сложность: O(n log n) гарантированно
- Пространственная сложность: O(n)
- Стабильность: сохраняет порядок равных элементов
Insertion Sort (сортировка вставками)
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
- Временная сложность: O(n²) в среднем, O(n) на отсортированных данных
- Пространственная сложность: O(1)
- Использование: эффективна на маленьких массивах (Timsort использует её внутри)
Таблица сравнения
| Алгоритм | Лучший | Средний | Худший | Пространство | Стабилен |
|---|---|---|---|---|---|
| Bubble | O(n²) | O(n²) | O(n²) | O(1) | Да |
| Selection | O(n²) | O(n²) | O(n²) | O(1) | Нет |
| Insertion | O(n) | O(n²) | O(n²) | O(1) | Да |
| Merge | O(n log n) | O(n log n) | O(n log n) | O(n) | Да |
| Quick | O(n log n) | O(n log n) | O(n²) | O(log n) | Нет |
| Heap | O(n log n) | O(n log n) | O(n log n) | O(1) | Нет |
| Timsort | O(n) | O(n log n) | O(n log n) | O(n) | Да |
Практические рекомендации
Всегда используй встроенные функции Python:
sorted(iterable)— создаёт новый отсортированный списокlist.sort()— сортирует список на месте
Они реализуют Timsort и оптимизированы на уровне C, поэтому работают быстрее любой реализации на Python.
Ручную реализацию алгоритмов нужна только для:
- Понимания алгоритмических основ на собеседованиях
- Специальных случаев (сортировка с кастомной логикой сравнения)
- Обработки данных, которые не влезают в память целиком