Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python合并排序_Python_Sorting_Merge_Mergesort - Fatal编程技术网

Python合并排序

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

我是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      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)。因为这是递归,所以知道函数返回时调用的深度很重要。