Две вещи:
При слиянии, если один из списков, которые должны быть объединены, пуст, вы не хотите возвращать этот список, вы хотите вернуть другой, потому что это тот, с остальными значениями. Другими словами, это назад:
if length_x == 0:
return x
if length_y == 0:
return y
Должно быть:
if length_x == 0:
return y
if length_y == 0:
return x
Также вы пытаетесь объединить целые и списки следующим образом:
# x[0] is a number
return x[0] + merge(x[1:length_x -1],y[0:length_y -1])
Что-то вроде этого может быть немного лучше:
def mergesort(A):
length_A = len(A)
split = length_A // 2
if length_A > 1:
return merge(mergesort(A[0:split]), mergesort(A[split:]))
else:
return A
def merge(x,y):
if len(x) == 0:
return y
if len(y) == 0:
return x
if x[0] <= y[0]:
return [x[0]] + merge(x[1:], y)
else:
return [y[0]] + merge(x, y[1:])
A = [10,2,5,3,7,13,1,6]
a = mergesort(A)
print(a)
результат
[1, 2, 3, 5, 6, 7, 10, 13]