请问一下老师这节代码是怎么运行的,不是很清楚?
来源:3-2 归并排序法的实现
iStream
2022-09-29
举例子 比如
int arr[9] = {8,7,6,5,4,3,2,1,0};
mergeSort2(arr, 9);
我打印一下是这样运行的
左(87654) 右(3210)
左(876) 右(54)
左(87) 右(6)
左(8) 右(7)
左(8) 右()
左(7) 右()
排序(78) 左(6) 右()
排序(678) 左(5) 右(4)
左(5) 右()
左(4) 右()
排序(45)
排序(45678) 左(32) 右(10)
左(3) 右(2)
左(3) 右()
左(2) 右()
排序(23) 左(1) 右(0)
左(1) 右()
左(0) 右()
排序(01)
排序(0123)
排序(012345678) Program ended with exit code: 0
感觉和老师说的动画,和思想联系起来,不知道代码是怎么运行的,有点模糊。
希望老师讲解一下这节代码的运行排序顺序。
1回答
-
liuyubobobo
2022-09-30
首先,如果你对递归的运行激励不是很清晰的,有可能这个课程整体都不是很适合你。具体可以参考这里:http://coding.imooc.com/learn/questiondetail/16248.html
这个课程不是针对算法0基础的课程,所以课程中对于诸如“递归”这样的概念没有进行深入阐述。如果第一次接触算法,尤其是对递归理解的不够深入的话,我推荐我的体系课程,其中对这些基础概念的介绍更加的系统,涵盖的内容也远远比这个课程丰富。有兴趣可以参考:https://class.imooc.com/sale/datastructure (但要注意,这个体系课程是使用 Java 讲解的。)
==========
回到你的问题,因为你已经做了打印输出,我相信你的打印输出类似于这个问答的形式:https://coding.imooc.com/learn/questiondetail/jlqGxXzbLWlXe1Dk.html (但是这个问答中我给出的注释更能清晰地看到整个函数的执行过程。)
在这个基础上,你要做的,不是直接运行整个程序,看整个打印输出。你要做的是,或者用单步跟踪的方式,或者用纸笔的方式,去手动一行一行执行代码,看每一次的打印输出,为什么打印出了这样的结果,为什么此时,程序中的变量是这个样子。
几点提示是:
1)我们的程序是串行执行的。代码是一行一行运行的。你应该手动去跟踪,整个代码,执行完一行以后,执行的下一行是什么,为什么是这样的。注意,我的动画演示看上去似乎是左右两部分一起执行的,但是因为我们的程序是串行运行,所以左右的执行是有先后顺序的。可以参考这里:https://coding.imooc.com/learn/questiondetail/4daeRY4eGBkXnWEp.html
2)递归函数和普通函数的调用没有区别。在 A 里调用 B,执行完 B,会回来继续执行 A。但是对于递归函数,是在 A 里调用 A,只不过调用的 A 的参数不同,你可以理解成是在 A1 里调用 A2,只不过 A2 的逻辑和 A1 一样,但是处理的参数范围不一样。A2 执行完以后,还是会回来继续执行 A1。
3)使用 8 个元素跟踪,是比使用 9 个元素跟踪简单的。甚至现在如果你对递归的机制不了解,使用 4 哥元素去跟踪,都是 OK 的。请你尝试先搞明白,对于 [3, 2, 1, 0] 这样一个数组,我们的代码到底是怎样执行,让它排好序的。再看 8 个元素;再看 9 个元素。
4)如果还不理解,你可以继续追加提问。但是我希望你的问题更加的具体,比如,你认为对于 4 个元素的排序过程,在某一句执行以后,或者打印输出完什么以后,你觉得下面该执行的是什么,或者之后某个变量应该是什么,或者应该打印出什么,但实际程序确实怎么样的,和你的预期不符,你觉得不应该这样,想不明白了。我们可以再根据你的具体问题做讨论。
依然是,如果你希望从更基础的角度去系统学习算法和数据结构,推荐我的体系课程。这个课程虽然初期讲解更基础,但是后面涵盖的内容,无论是广度还是深度,都远超这个课程:https://class.imooc.com/sale/datastructure
继续加油!:)
022022-09-30
相似问题