Я начал изучать python несколько дней назад и пытался решить алгоритмы сортировки. Я недавно начал с алгоритма сортировки слиянием. Типичная программа сортировки слиянием в python (насколько я знаю) включает функцию слияния и функцию слияния. Следующие строки являются общими для всех программ, которые я видел:
left = mergesort(left)
right = mergesort(right)
merge(left, right)
Например, в этом коде:
def divide_arr(a): #same as mergesort function
l = len(a)
if l <= 1: return a
left = a[0:int(l/2)]
right = a[int(l/2):l]
left = divide_arr(left)
right = divide_arr(right)
return merge(left, right, a)
def merge(left, right, arr):
pl, pr, pa = 0, 0, 0
while pl <len(left) and pr < len(right):
if left[pl] <= right[pr]:
arr[pa] = left[pl]
pa += 1
pl += 1
elif left[pl] > right[pr]:
arr[pa] = right[pr]
pa += 1
pr += 1
while pl < len(left):
arr[pa] = left[pl]
pa += 1
pl += 1
while pr < len(right):
arr[pa] = right[pr]
pa += 1
pr += 1
return arr
Я действительно не уверен, как компилятор интерпретирует эти строки.
Давайте возьмем массив [4,3,2,1]. Поэтому, когда я вызываю mergesort, первый левый массив становится = [4,3], а правый = [2,1]
Теперь, когда я рекурсивно вызываю mergesort для левого массива, я должен наконец получить левую = [4] и после этого я вызываю его для правого массива, который должен стать = [1]
Итак, я должен остаться со слиянием [4] и [1] и он должен вернуть [1,4] в качестве окончательно отсортированной массив. Однако это не так, и код действительно возвращает правильный отсортированный массив.
Есть ли другой способ, которым компилятор интерпретирует этот рекурсивный код? Или я ошибаюсь с тем, что написал выше?
PS: я знаю, что на подобные вопросы здесь даны ответы, но они не имеют отношения к этим конкретным c строкам кода, а скорее дают общее представление сортировки слиянием