Назад к вопросам
Junior
84
questionbank
Что такое сортировка слиянием?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Сортировка слиянием (Merge Sort) — это алгоритм сортировки, основанный на принципе "разделяй и властвуй". Он рекурсивно делит массив на две половины, сортирует каждую половину, а затем объединяет (сливает) отсортированные половины в один отсортированный массив.
Основные шаги:
- Разделение: Если массив содержит более одного элемента, он делится на два подмассива примерно равного размера.
- Рекурсивная сортировка: Сортировка слиянием рекурсивно вызывается для каждой из двух подмассивов.
- Слияние: Отсортированные подмассивы объединяются (сливаются) в один отсортированный массив.
def merge_sort(arr):
# Базовый случай: если массив содержит 0 или 1 элемент, он уже отсортирован
if len(arr) <= 1:
return arr
# Делим массив пополам
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
# Рекурсивно сортируем обе половины
left_half = merge_sort(left_half)
right_half = merge_sort(right_half)
# Объединяем отсортированные половины
return merge(left_half, right_half)
def merge(left, right):
# Инициализируем пустой результат и указатели
result = []
i = 0 # Указатель для левой половины
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
# Добавляем оставшиеся элементы из левой половины (если есть)
while i < len(left):
result.append(left[i])
i += 1
# Добавляем оставшиеся элементы из правой половины (если есть)
while j < len(right):
result.append(right[j])
j += 1
return result
# Пример использования
# unsorted_list = [12, 11, 13, 5, 6, 7]
# sorted_list = merge_sort(unsorted_list)
# print(sorted_list) # [5, 6, 7, 11, 12, 13]
Сложность алгоритма:
| Операция | Временная сложность | Пространственная сложность |
|---|---|---|
| Наихудший случай | O(n log n) | O(n) |
| Средний случай | O(n log n) | O(n) |
| Наилучший случай | O(n log n) | O(n) |
Преимущества:
- Гарантированная временная сложность O(n log n) во всех случаях (наилучшем, среднем, наихудшем).
- Стабильная сортировка (сохраняет относительный порядок равных элементов).
Недостатки:
- Требует дополнительной памяти O(n) для слияния подмассивов.