← Назад к вопросам

Какая сложность сортировки списка?

1.6 Junior🔥 63 комментариев
#Python

Комментарии (3)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какая сложность сортировки списка?

Сложность сортировки списка в Python

Сортировка списка в Python имеет среднюю сложность O(n log n), в лучшем случае O(n), в худшем — O(n log n).

Алгоритм: Timsort

Python использует Timsort — гибридный алгоритм сортировки, комбинирующий слияние (merge sort) и вставку (insertion sort).

Сложность Timsort

СлучайСложностьУсловие
Лучший случайO(n)Список уже отсортирован
Средний случайO(n log n)Случайный порядок
Худший случайO(n log n)Полностью перевернут
ПамятьO(n)Требует доп. памяти

Почему Timsort лучше?

Timsort детектирует уже отсортированные последовательности (runs) и использует их, поэтому:

  • На отсортированном списке работает за O(n)
  • На случайном списке работает за O(n log n)
  • На обратном списке тоже O(n log n)

Сравнение алгоритмов сортировки

АлгоритмЛучшийСреднийХудшийПамятьИспользуется
TimsortO(n)O(n log n)O(n log n)O(n)✅ Python
QuicksortO(n log n)O(n log n)O(n²)O(log n)Java, C++
MergesortO(n log n)O(n log n)O(n log n)O(n)Альтернатива
HeapsortO(n log n)O(n log n)O(n log n)O(1)Когда память мала
InsertionO(n)O(n²)O(n²)O(1)Маленькие списки

Практические примеры

Встроенная сортировка Python

# Самый быстрый способ — встроенный sort()
lst = [3, 1, 4, 1, 5, 9, 2, 6]
lst.sort()  # O(n log n), работает "на месте"

# Или sorted() — создает новый список
new_lst = sorted(lst)  # O(n log n)

Сортировка с ключом

students = [
    {"name": "Alice", "grade": 85},
    {"name": "Bob", "grade": 92},
    {"name": "Charlie", "grade": 78},
]

# O(n log n)
sorted_students = sorted(students, key=lambda s: s["grade"])

# Обратная сортировка
sorted_students = sorted(students, key=lambda s: s["grade"], reverse=True)

Сортировка в Data Science

import numpy as np
import pandas as pd

# NumPy сортировка — O(n log n)
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
sorted_arr = np.sort(arr)

# Pandas сортировка — O(n log n)
df = pd.DataFrame({"score": [85, 92, 78, 88]})
df_sorted = df.sort_values("score")

# Индексирование с сортировкой
indices = np.argsort(arr)  # O(n log n)

Оптимизация сортировки

Используйте встроенные функции

# Быстро: встроенный sort()
lst.sort()  # O(n log n)

# Медленно: ручная реализация bubble sort
# O(n²) — в 1000 раз медленнее!

Сортировка по нескольким ключам

data = [
    {"dept": "Sales", "salary": 5000},
    {"dept": "Engineering", "salary": 7000},
    {"dept": "Sales", "salary": 6000},
]

# Сортировка по dept, потом по salary — O(n log n)
sorted_data = sorted(data, key=lambda x: (x["dept"], x["salary"]))

list.sort() vs sorted()

# list.sort() — сортирует на месте, быстрее
lst = [3, 1, 4, 1, 5, 9]
lst.sort()  # O(n log n), изменяет lst

# sorted() — создает новый список
lst = [3, 1, 4, 1, 5, 9]
new_lst = sorted(lst)  # O(n log n), lst не изменяется

Итого

Сортировка списка в Python — O(n log n) благодаря алгоритму Timsort. В лучшем случае (уже отсортированный) — O(n). Timsort оптимален для практического использования, часто работает быстрее других алгоритмов благодаря обнаружению уже отсортированных последовательностей. Всегда используйте встроенные sort() или sorted() вместо ручной реализации.