修复索引后,还有其他问题。“Mergesort”应该就地进行排序,修改原始列表。你没有那样做;你在试图建立一个新的列表。这意味着您需要返回已创建的列表,并在下一步中使用它。
然后,
c
不能是全球性的。它是“merge”函数的本地调用,因此每个调用都有自己的副本。最后,每个合并步骤只处理列表的一部分。你必须复制你没有改变的部分。这似乎有效:
def mergesort(a,low,high):
if low<high:
mid=(high+low)//2
a = mergesort(a,low,mid)
a = mergesort(a,mid+1,high)
a = merge(a,low,mid,high)
return a
def merge(a,low,mid,high):
c = a[:low]
i=low
j=mid+1
while i<=mid and j<=high:
if a[i]<=a[j]:
print(a[i])
c.append(a[i])
i+=1
else:
print(a[i])
c.append(a[j])
j+=1
c.extend( a[i:mid+1] )
c.extend( a[j:] )
return c
a=[4,2,7,0,9,6,5]
c = mergesort(a,0,len(a)-1)
print(c)