[英]Merge Sort in Python3
我有一些有效的代码,但我不太明白它为什么有效。 如果有人可以带我浏览其中的几部分,或者解释我的假设错误的地方,我将不胜感激。
这是代码:
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)
如果我理解正确,该函数将一遍又一遍地划分列表的左半部分,创建越来越小的子列表,直到它们只有一个项目长,然后移到右半部分。 那是对的吗? EX: list=[1, 2, 3, 4, 5, 6, 7, 8] 会被分解成 [1, 2, 3, 4] 和 [5, 6, 7, 8], 那么函数就会被分解左半部分转化为 [1, 2] 和 [3, 4],然后将 [1, 2] 转化为 [1] 和 [2],然后再向后处理。 下一步是将 [3, 4] 分解为 [3] 和 [4],然后再返回 [5, 6, 7, 8] 并重复所有相同的步骤。 那是对的吗?
我的另一个问题是,不应该将 i 和 j 重置为 0 以重新组合所有小子列表吗? 例如:对于 [1] 和 [2] 变成 [1, 2] i 和 j 变成 1,但是他们不能指向 [3] 和 [4] 变成 [3, 4] 因为它们都在索引 0。我在这里遗漏了什么?
不要考虑整个过程。 递归思考。 谁关心哪个列表首先被分解? 您只需要知道:
alist
,对每一半进行排序,然后将两半合并到alist
,就像 3 个 while 循环一样,它是否已排序? 答案是肯定的。 对于您的另一个问题,一次调用中的i
、 j
和k
完全独立于其他调用中的那些。 即使它们不是,它们也会在while
循环开始之前被设置为0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.