Программа курса:
Разбор задачи: Объединение отсортированных массивов
Предложенный нами код решения:
def sort_merge(nums1, m, nums2, n):
"""
Объединяет два отсортированных массива nums1 и nums2 в массив nums1,
сохраняя порядок неубывания.
:param nums1: list[int], массив длиной m + n, первые m элементов значимы
:param m: int, количество значимых элементов в nums1
:param nums2: list[int], массив длиной n
:param n: int, количество значимых элементов в nums2
"""
# Указатели для массивов
p1 = m - 1 # Последний значимый элемент в nums1
p2 = n - 1 # Последний элемент в nums2
p = m + n - 1 # Последняя позиция в nums1
# Сравнение элементов с конца и заполнение nums1
while p1 >= 0 and p2 >= 0:
if nums1[p1] > nums2[p2]:
nums1[p] = nums1[p1]
p1 -= 1
else:
nums1[p] = nums2[p2]
p2 -= 1
p -= 1
# Если остались элементы в nums2
while p2 >= 0:
nums1[p] = nums2[p2]
p2 -= 1
p -= 1Функция sort_merge(nums1, m, nums2, n) должна объединить два отсортированных массива (nums1 и nums2) в один отсортированный массив. Объединение выполняется "на месте", в массиве nums1, который изначально имеет достаточную длину для хранения всех элементов из обоих массивов.
Параметры функции
nums1— список длинойm + n, где первыеmэлементов содержат значимые данные, а оставшиесяnэлементов равны 0 (запасные места для объединения).m— количество значимых элементов в массивеnums1.nums2— второй массив длинойn, который нужно объединить сnums1.n— количество значимых элементов в массивеnums2.
Подход к решению
Для объединения массивов используется обратный подход:
- Заполнение
nums1начинается с конца массива, где расположены запасные места, чтобы избежать необходимости сдвига элементов. - Сравнение идет между последними элементами значимой части
nums1иnums2.
Шаги алгоритма
- Инициализация указателей:
p1указывает на последний значимый элемент вnums1(m - 1).p2указывает на последний элемент вnums2(n - 1).pуказывает на последнюю позицию в массивеnums1(m + n - 1).
- Сравнение элементов:
- Пока оба указателя
p1иp2находятся в допустимых пределах (p1 >= 0иp2 >= 0), элементы на позицияхp1иp2сравниваются. - Больший из элементов записывается в позицию
pмассиваnums1. Указателиpиp1илиp2уменьшаются в зависимости от того, откуда был взят элемент.
- Пока оба указателя
- Заполнение остатка из
nums2:- Если в
nums2остались неиспользованные элементы (т.е.,p2 >= 0), они записываются в массивnums1начиная с позицииp.
- Если в
Пример работы
Входные данные:
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
Ход выполнения:
- Инициализация:
p1 = 2,p2 = 2,p = 5. - Шаг 1: Сравниваем
nums1[2](3) иnums2[2](6). Берем 6, записываем вnums1[5]. Обновляем:nums1 = [1, 2, 3, 0, 0, 6],p2 = 1,p = 4. - Шаг 2: Сравниваем
nums1[2](3) иnums2[1](5). Берем 5, записываем вnums1[4]. Обновляем:nums1 = [1, 2, 3, 0, 5, 6],p2 = 0,p = 3. - Шаг 3: Сравниваем
nums1[2](3) иnums2[0](2). Берем 3, записываем вnums1[3]. Обновляем:nums1 = [1, 2, 3, 3, 5, 6],p1 = 1,p = 2. - Шаг 4: Сравниваем
nums1[1](2) иnums2[0](2). Берем 2, записываем вnums1[2]. Обновляем:nums1 = [1, 2, 2, 3, 5, 6],p2 = -1,p = 1. nums2пустой, алгоритм завершен.
Результат:
nums1 = [1, 2, 2, 3, 5, 6]
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии