Всем привет
У меня вопрос по Алгоритму сортировки, который написал уважаемый Т.Ф. Хирьянов. В том виде, как я его переписал, он не работает:
def merge(a: list, b: list):
"""merges two already sorted lists"""
c = [0] * (len(a) + len(b))
i = k = n = 0
while i < len(a) and k < len(b):
if a[i] <= b[k]:
c[n] = a[i]
i += 1
n += 1
else:
c[n] = b[k]
k += 1
n += 1
while i < len(a):
c[n] = a[i]
i += 1
n += 1
while k < len(b):
c[n] = b[k]
k += 1
n += 1
return c
def merge_sort(a):
if len(a) <= 1:
return
middle = len(a) // 2
l = a[:middle]
r = a[middle:]
merge_sort(l)
merge_sort(r)
merge(l, r)
Но если реализацию оставить внутри функции, а не вызвать функцией, то все работает:
def mergeSort(alist):
if len(alist) > 1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i = 0
j = 0
k = 0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k] = lefthalf[i]
i += 1
k += 1
else:
alist[k] = righthalf[j]
j += 1
k += 1
while i < len(lefthalf):
alist[k] = lefthalf[i]
i += 1
k += 1
while j < len(righthalf):
alist[k] = righthalf[j]
j += 1
k += 1
Прилагаю скриншоты