Разные алгоритмы сортировки и их реализации.

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Разные алгоритмы сортировки и их реализации в Python: Полный разбор с примерами

Сортировка данных — одна из важнейших операций в программировании. Выбор правильного алгоритма сортировки может значительно повлиять на производительность программы, особенно при работе с большими объёмами данных.

В этой статье мы разберём популярные алгоритмы сортировки, их преимущества, недостатки и примеры реализации на языке Python.


Зачем нужно сортировать данные?

  • Упрощение поиска информации (например, бинарный поиск работает только с отсортированными данными).

  • Повышение читаемости данных.

  • Подготовка данных для дальнейших вычислений или аналитики.

  • Оптимизация алгоритмов машинного обучения и обработки данных.


Виды алгоритмов сортировки

  1. Простые алгоритмы сортировки:

    • Сортировка пузырьком (Bubble Sort)

    • Сортировка вставками (Insertion Sort)

    • Сортировка выбором (Selection Sort)

  2. Эффективные алгоритмы:

    • Быстрая сортировка (Quick Sort)

    • Сортировка слиянием (Merge Sort)

    • Пирамидальная сортировка (Heap Sort)

  3. Специализированные алгоритмы:

    • Поразрядная сортировка (Radix Sort)

    • Сортировка подсчётом (Counting Sort)


Сортировка пузырьком (Bubble Sort)

Идея алгоритма:
Проходить по массиву и "всплывать" максимальный элемент в конец массива, повторяя процесс до полной сортировки.

📚 Реализация на Python:

python
def bubble_sort(arr): 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 print(bubble_sort([5, 1, 4, 2, 8]))

Сложность:

  • В худшем случае: O(n²)

  • В лучшем случае: O(n) (если массив уже отсортирован)


Сортировка вставками (Insertion Sort)

Идея алгоритма:
Разбиваем массив на отсортированную и неотсортированную части и вставляем элементы из неотсортированной части в нужное место.

📚 Реализация на Python:

python
def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr print(insertion_sort([5, 1, 4, 2, 8]))

Сложность:

  • В худшем случае: O(n²)

  • В лучшем случае: O(n)


Сортировка выбором (Selection Sort)

Идея алгоритма:
На каждом шаге находим минимальный элемент в неотсортированной части и перемещаем его в начало.

📚 Реализация на Python:

python
def selection_sort(arr): for i in range(len(arr)): min_idx = i for j in range(i + 1, len(arr)): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr print(selection_sort([5, 1, 4, 2, 8]))

Сложность:

  • Всегда O(n²)


Быстрая сортировка (Quick Sort)

Идея алгоритма:
Выбираем опорный элемент (pivot) и делим массив на две части: элементы меньше и больше опорного, рекурсивно сортируем обе части.

📚 Реализация на Python:

python
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) print(quick_sort([5, 1, 4, 2, 8]))

Сложность:

  • В среднем: O(n log n)

  • В худшем случае: O(n²) (если опорный элемент выбран неудачно)


Сортировка слиянием (Merge Sort)

Идея алгоритма:
Разделяем массив на две половины, рекурсивно сортируем их и затем объединяем.

📚 Реализация на Python:

python
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 result.extend(left[i:]) result.extend(right[j:]) return result print(merge_sort([5, 1, 4, 2, 8]))

Сложность:

  • Всегда O(n log n)


Пирамидальная сортировка (Heap Sort)

Идея алгоритма:
Используем структуру данных "куча" (heap), чтобы эффективно выбирать максимальный элемент.

📚 Реализация на Python с помощью модуля heapq:

python
import heapq def heap_sort(arr): heapq.heapify(arr) return [heapq.heappop(arr) for _ in range(len(arr))] print(heap_sort([5, 1, 4, 2, 8]))

Сложность:

  • Всегда O(n log n)


Поразрядная сортировка (Radix Sort)

Идея алгоритма:
Сортируем числа по разрядам, начиная с младших.

📚 Реализация на Python:

python
def counting_sort_for_radix(arr, exp): n = len(arr) output = [0] * n count = [0] * 10 for i in range(n): index = arr[i] // exp % 10 count[index] += 1 for i in range(1, 10): count[i] += count[i - 1] i = n - 1 while i >= 0: index = arr[i] // exp % 10 output[count[index] - 1] = arr[i] count[index] -= 1 i -= 1 for i in range(n): arr[i] = output[i] def radix_sort(arr): max_num = max(arr) exp = 1 while max_num // exp > 0: counting_sort_for_radix(arr, exp) exp *= 10 return arr print(radix_sort([170, 45, 75, 90, 802, 24, 2, 66]))

Сложность:

  • O(n * k), где k — количество разрядов


Сравнительная таблица алгоритмов сортировки

Алгоритм Лучшая сложность Худшая сложность Стабильность Использование
Bubble Sort O(n) O(n²) Да Учебные задачи
Insertion Sort O(n) O(n²) Да Маленькие массивы
Selection Sort O(n²) O(n²) Нет Редко используется
Quick Sort O(n log n) O(n²) Нет Быстрая сортировка массивов
Merge Sort O(n log n) O(n log n) Да Большие массивы
Heap Sort O(n log n) O(n log n) Нет Системное программирование
Radix Sort O(n * k) O(n * k) Да Специальные случаи

Заключение

Знание различных алгоритмов сортировки важно для написания эффективных и оптимизированных программ. Каждый алгоритм имеет свои преимущества и области применения. При работе с небольшими массивами можно использовать простые алгоритмы, такие как сортировка вставками или пузырьком. Для больших данных и производительных систем лучше подходят Quick Sort, Merge Sort или Radix Sort.

Не забывайте, что Python предоставляет встроенный метод list.sort() и функцию sorted(), которые реализуют эффективную гибридную сортировку Timsort (основанную на Merge Sort и Insertion Sort).

Новости