Сортировка слиянием – это популярный алгоритм сортировки по принципу “разделяй и властвуй”, который работает путем разделения неотсортированного списка на более мелкие подсписки, их рекурсивной сортировки, а затем их обратного слияния. Шаг слияния в Mergesort играет решающую роль в объединении отсортированных подсписков. В этой статье мы рассмотрим несколько различных методов слияния в алгоритме Mergesort, а также приведем примеры кода.
- Простое объединение.
Самый простой способ объединить два отсортированных подсписка — сравнить элементы из обоих списков и вставить их в новый список в соответствии с их порядком. Вот пример на Python:
def merge(arr, left, mid, right):
i = left
j = mid + 1
merged = []
while i <= mid and j <= right:
if arr[i] <= arr[j]:
merged.append(arr[i])
i += 1
else:
merged.append(arr[j])
j += 1
while i <= mid:
merged.append(arr[i])
i += 1
while j <= right:
merged.append(arr[j])
j += 1
for k in range(len(merged)):
arr[left + k] = merged[k]
- Слияние на месте.
Наивный подход требует дополнительного места для объединенного списка. Однако можно объединить подсписки на месте, уменьшив сложность пространства. Этого можно добиться, используя слегка измененную версию функции слияния:
def merge_in_place(arr, left, mid, right):
i = left
j = mid + 1
while i <= mid and j <= right:
if arr[i] <= arr[j]:
i += 1
else:
value = arr[j]
index = j
while index != i:
arr[index] = arr[index - 1]
index -= 1
arr[i] = value
i += 1
mid += 1
j += 1
- Слияние Sentinel:
Слияние Sentinel — это метод оптимизации, позволяющий избежать повторных проверок достижения конца подсписков во время слияния. Он предполагает добавление контрольных значений в конце обоих подсписков, чтобы исключить необходимость граничных проверок. Вот пример на Python:
def sentinel_merge(arr, left, mid, right):
left_arr = arr[left:mid+1]
right_arr = arr[mid+1:right+1]
left_arr.append(float('inf'))
right_arr.append(float('inf'))
i = 0
j = 0
for k in range(left, right+1):
if left_arr[i] <= right_arr[j]:
arr[k] = left_arr[i]
i += 1
else:
arr[k] = right_arr[j]
j += 1
Слияние — важнейшая операция в алгоритме сортировки слиянием, и существуют различные методы ее эффективного выполнения. Мы исследовали метод наивного слияния, слияния на месте и метод дозорного слияния. Каждый метод имеет свои преимущества и особенности с точки зрения временной и пространственной сложности. Понимая эти различные методы слияния, разработчики могут оптимизировать и настраивать алгоритм сортировки слиянием в соответствии со своими конкретными требованиями.