← Назад к вопросам
Приведи примеры сортировок с их асимптотической сложностью в Python
1.0 Junior🔥 212 комментариев
#Python
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Алгоритмы сортировки и их асимптотическая сложность в Python
Рассмотрим основные алгоритмы сортировки с анализом временной и пространственной сложности.
1. Bubble Sort (Сортировка Пузырьком)
def bubble_sort(arr):
"""O(n²) всегда"""
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
# Анализ:
# Best case: O(n²) — даже отсортированный массив проходит весь
# Average case: O(n²)
# Worst case: O(n²) — обратный порядок
# Space: O(1) — in-place
2. Selection Sort (Сортировка Выбором)
def selection_sort(arr):
"""O(n²) всегда"""
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
# Анализ:
# Best case: O(n²)
# Average case: O(n²)
# Worst case: O(n²)
# Space: O(1) — in-place, очень стабилен
3. Insertion Sort (Сортировка Вставками)
def insertion_sort(arr):
"""O(n) лучший, O(n²) худший"""
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
# Анализ:
# Best case: O(n) — уже отсортирован
# Average case: O(n²)
# Worst case: O(n²) — обратный порядок
# Space: O(1) — in-place
# Используется в Timsort для малых массивов
4. Merge Sort (Сортировка Слиянием)
def merge_sort(arr):
"""O(n log n) всегда"""
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
result.extend(left[i:])
result.extend(right[j:])
return result
# Анализ:
# Best case: O(n log n)
# Average case: O(n log n)
# Worst case: O(n log n) — гарантирован!
# Space: O(n) — нужен дополнительный массив
# Стабильная сортировка
5. Quick Sort (Быстрая Сортировка)
def quick_sort(arr):
"""O(n log n) средний, O(n²) худший"""
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)
# In-place версия (более популярная):
def quick_sort_inplace(arr, low=0, high=None):
if high is None:
high = len(arr) - 1
if low < high:
pi = partition(arr, low, high)
quick_sort_inplace(arr, low, pi - 1)
quick_sort_inplace(arr, pi + 1, high)
return arr
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] < pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
# Анализ:
# Best case: O(n log n) — хороший выбор pivot
# Average case: O(n log n)
# Worst case: O(n²) — плохой pivot (например, всегда минимум/максимум)
# Space: O(log n) — рекурсивный стек (in-place)
# Нестабильная
6. Heap Sort (Сортировка Кучей)
def heap_sort(arr):
"""O(n log n) всегда"""
def heapify(n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if left < n and arr[left] > arr[largest]:
largest = left
if right < n and arr[right] > arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(n, largest)
n = len(arr)
# Построить Max Heap
for i in range(n // 2 - 1, -1, -1):
heapify(n, i)
# Извлечь элементы
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(i, 0)
return arr
# Анализ:
# Best case: O(n log n)
# Average case: O(n log n)
# Worst case: O(n log n) — гарантирован
# Space: O(1) — in-place
# Нестабильная, но с гарантией O(n log n)
7. Python's Built-in: Timsort (Hybrid)
# Python использует Timsort (комбинация Insertion Sort + Merge Sort)
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = sorted(arr) # O(n log n) в среднем
arr.sort() # In-place, O(n log n) в среднем
# Анализ Timsort:
# Best case: O(n) — уже отсортирован
# Average case: O(n log n)
# Worst case: O(n log n)
# Space: O(n) для временных буферов
# Стабильная, адаптивная к реальным данным
Сравнительная таблица
| Алгоритм | Best | Average | Worst | Space | Стабильная |
|---|---|---|---|---|---|
| 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) | Да |
Когда использовать
# Для Data Science:
# - sorted() или .sort() — всегда используй встроенное (Timsort)
# - Для маленьких данных (< 50 элементов) — Insertion Sort
# - Для гарантированного O(n log n) — Merge Sort или Heap Sort
# - Для in-place с O(n log n) в среднем — Quick Sort
# NumPy сортировка:
import numpy as np
arr = np.array([64, 34, 25, 12, 22])
np.sort(arr) # Timsort, O(n log n)
arr.sort() # In-place Timsort
np.argsort(arr) # Индексы после сортировки
Практический совет
Для данных в Data Science проектов всегда используй встроенные функции (sorted, DataFrame.sort_values). Они оптимизированы и выбирают лучший алгоритм автоматически. Реализация с нуля — только для интервью и educational целей.