Python合并排序
我是python新手。我不明白程序是如何在“print”(“Merging”,alist)之后返回到mergeSort的。有人能解释一下吗?谢谢Python合并排序,python,sorting,merge,mergesort,Python,Sorting,Merge,Mergesort,我是python新手。我不明白程序是如何在“print”(“Merging”,alist)之后返回到mergeSort的。有人能解释一下吗?谢谢 def mergeSort(alist): print("Splitting ",alist) 3 if len(alist)>1: mid = len(alist)//2 lefthalf = alist[:mid] righthalf = alist[mid:] 8
def mergeSort(alist):
print("Splitting ",alist)
3 if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
8 mergeSort(lefthalf)
9 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
32 print("Merging ",alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
def合并排序(列表):
打印(“拆分”,列表)
3如果len(alist)>1:
mid=len(alist)//2
lefthalf=alist[:mid]
righthalf=alist[中间:]
8合并排序(左半部分)
9合并排序(右半部分)
i=0
j=0
k=0
当我运行你的程序时,我得到:
('Splitting ', [54, 26, 93, 17, 77, 31, 44, 55, 20])
('Splitting ', [54, 26, 93, 17])
('Splitting ', [54, 26])
('Splitting ', [54])
('Merging ', [54])
('Splitting ', [26])
('Merging ', [26])
('Merging ', [26, 54])
('Splitting ', [93, 17])
('Splitting ', [93])
('Merging ', [93])
('Splitting ', [17])
('Merging ', [17])
('Merging ', [17, 93])
('Merging ', [17, 26, 54, 93])
('Splitting ', [77, 31, 44, 55, 20])
('Splitting ', [77, 31])
('Splitting ', [77])
('Merging ', [77])
('Splitting ', [31])
('Merging ', [31])
('Merging ', [31, 77])
('Splitting ', [44, 55, 20])
('Splitting ', [44])
('Merging ', [44])
('Splitting ', [55, 20])
('Splitting ', [55])
('Merging ', [55])
('Splitting ', [20])
('Merging ', [20])
('Merging ', [20, 55])
('Merging ', [20, 44, 55])
('Merging ', [20, 31, 44, 55, 77])
('Merging ', [17, 20, 26, 31, 44, 54, 55, 77, 93])
[17, 20, 26, 31, 44, 54, 55, 77, 93]
拆分:
以下是分析:
1) 您的数组首先被带入列表中
2) 然后拆分数组的左半部分并将其作为列表
3) 其中的左半部分被视为阿吉安主义者
4) 现在你54岁了
一旦你弄明白了这一点,看到同样的模式再次做的右半部分
这是递归
合并:
1) 合并排序的核心是合并两个数组
2) 在每个阶段,合并2个阵列
3) 每次拆分到单个元素时,都会合并两个数组
希望这有帮助。要了解更多信息,请查看关于合并排序的youtube视频。您的意思是想知道为什么在打印(“合并”,列表)
之后执行打印(列表)
?为什么不这样做呢?也许维基百科上的文章会有帮助…我试着在上面添加行号。我明白了为什么程序会在第3行的if语句之后转到第32行。但是,为什么会在32号线之后移到9号线?感谢您的mergeSort
函数是递归的。在第8行中,它称自己为。对mergeSort
的第二次调用到达第32行并返回。然后程序在第9行继续。我尝试在上面添加行号。我明白了为什么程序会在第3行的if语句之后转到第32行。但是,为什么会在32号线之后移到9号线?thanksgood问题:发生这种情况是因为调用left half的函数返回。然后调用右半部分的函数执行。(这就是合并排序的工作原理)不,不要更改代码。我是说调用“mergesort(lefthalf)”的程序行完成了执行。在第32行,当它转到单个元素时。然后返回第9行并调用mergesort(rightshalf)。因为这是递归,所以知道函数返回时调用的深度很重要。