以下代码是本网站的副本 http://interactivepython.org/runestone/static/pythonds/SortSearch/TheMergeSort.html
def mergeSort(alist):
print("Splitting ",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=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
在上面的代码中,有两个几乎相同的while循环,例如
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
和
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
添加最后一个while循环的原因是什么? 谢谢!
答案 0 :(得分:1)
好的,首先,请记住合并排序的工作原理:它合并排序的子列表以创建更长的排序子列表,直到整个列表排序。 (这个简单的案例是一个单项子列表,根据定义排序。)
第一个while
循环从源子列表中获取项目,直到到达 的末尾。此时,可能还有其他子列表中仍有项目。但是,这些项目都已知大于(或等于)输出列表中的项目。另外两个while
循环(其中只有一个循环实际执行,因为已经满足另一个的终止条件)将这些剩余的项复制到输出列表中。如果没有这些循环,您可能会丢失一些项目。