Во-первых, бесконечный цикл вызван if first < last:
, например, если first = 2, last = 3, он никогда не пробьется, если вы измените его на first < last-1
, это вызовет другую проблему, две длины список останется несортированным. Так что лучший способ решить эту проблему - не включать, например, [first, last)
.
И в вашей программе есть другие проблемы, такие как синтаксическая проблема, индекс вне диапазона при слиянии и другие проблемы.
Я исправил их с комментарием:
def mSort(liste):
# change the last index
# mSortHelp(liste, 0, len(liste) - 1)
mSortHelp(liste, 0, len(liste))
return liste
def mSortHelp(liste, first, last):
# here is the key point causes infinit loop, such as first=2 last = 3
# if first < last:
if first < last - 1:
mid = (first + last) // 2
mSortHelp(liste, mid, last)
mSortHelp(liste, first, mid)
merge(liste, first, mid, last)
return liste
def merge(liste, first, mid, last):
LeftList = liste[first:mid]
# change the last index
# RightList = liste[mid:last + 1]
RightList = liste[mid:last]
i = j = 0
print(LeftList, RightList)
# here should be last, which means [first, last+1)
for k in range(first, last):
# here will cause "IndexError: list index out of range", if i or j reach the end
# if LeftList[i] <= RightList[j]:
if i < len(LeftList) and j < len(RightList):
if LeftList[i] <= RightList[j]:
liste[k] = LeftList[i]
i += 1
else:
liste[k] = RightList[j]
j += 1
# when one list reach the end
else:
if i < len(LeftList):
liste[k] = LeftList[i]
i += 1
else:
liste[k] = RightList[j]
j += 1
print(liste[first: last])
# return is not necessary here, has been changed by parameter reference
# return liste
Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)