请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问一下老师这节代码是怎么运行的,不是很清楚?

举例子 比如 

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

感觉和老师说的动画,和思想联系起来,不知道代码是怎么运行的,有点模糊。

希望老师讲解一下这节代码的运行排序顺序。

正在回答 回答被采纳积分+3

1回答

liuyubobobo 2022-09-30 02:21:59

首先,如果你对递归的运行激励不是很清晰的,有可能这个课程整体都不是很适合你。具体可以参考这里: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


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 iStream #1
    “我们的程序是串行执行的。代码是一行一行运行的。你应该手动去跟踪,整个代码”
    
    老师发现不好跟踪调试,  看代码该递归一次,应该执行 __merge函数一次,
    可是调试实际结果是递归一会,  再去执行__merge函数一会
    调试时没有按照我们现象的窜行 debug。 会被递归打乱
    回复 有任何疑惑可以回复我~ 2022-09-30 19:27:51
  • 提问者 iStream #2
    1,我的理解
    比如arr 有四个元素
    第一递归  排序 l=0 r=3  
    第二递归  排序 l=2 r=3 
    第三递归  排序 l=0 r=1 
    2,希望一次解决
    请问是不是这个运行的方式,
    不是很理解,希望老师直接回答,
    麻烦老师讲解一下 [3, 2, 1, 0]
    这三次递归的运行,归并排序的过程,或许我就理解了。感谢
    回复 有任何疑惑可以回复我~ 2022-09-30 21:48:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信